使用嵌入式Firebird时,删除表失败并显示“元数据更新失败”

简·多根(Jan Doggen)

我的代码执行以下操作:

  1. 设定设计目标 TFDConnection
  2. 创建运行时源 TFDConnection
  3. 将所有索引和表放在目标中
  4. 重新创建那些
  5. 将所有数据从源复制到目标
  6. 删除其中一个表(和索引),名为 TT_SYS_WEEKS
  7. 重新创建并填充它

TFDConnections可以嵌入或不嵌入Firebird。在所有组合中都可以正常工作,除非同时嵌入了两者。

在步骤6中,执行后

DROP INDEX <OWNER>TT_I1_SYS_WEEKS
ALTER TABLE <OWNER>TT_SYS_WEEKS DROP CONSTRAINT TT_I0_SYS_WEEKS

该声明

DROP TABLE TT_SYS_WEEKS

失败[FireDAC][FB][Phys]unsuccesful metadata update Table TT_SYS_WEEKS already exists

在步骤3、4、5中已经执行了完全相同的删除和创建表/索引的操作。TT_SYS_WEEKS不是最后复制的表。

设计时间目标连接及其TFDPhysFBDriverLink设置如下:

AConnection.TxOptions.AutoCommit := true;
AFDPhysDriverLink.DriverID := 'FBEmbeddedBase';  // JD 28-3-2018
AFDPhysDriverLink.VendorLib := 'fbembed.dll';  // 32-bits only
AConnection.Params.DriverID := 'FBEmbeddedBase'; // AConnection
AConnection.Params.Database := 'full GDB file';
SetFireBirdMapRules(AConnection); // Some mapping rules
AConnection.UpdateOptions.LockWait := False;
AConnection.UpdateOptions.LockMode := lmNone;

运行时源连接和TFDPhysFBDriverLink设置如下:

// Create 'own' TFDPhysFBDriverLink for embedded connection
// https://stackoverflow.com/questions/46691699/setting-up-a-second-tfdphysfbdriverlink-possible-and-necessary
lDriverLink := TFDPhysFBDriverLink.Create(Application);
lDriverLink.DriverID := 'FBEmbedded';
lDriverLink.VendorLib := 'fbembed.dll';  // 32-bits embedded
LRestoreDB := TFDConnection.Create(Application);
LRestoreDB.UpdateOptions.RequestLive     := false; 
LRestoreDB.ResourceOptions.AutoReconnect := true;
LRestoreDB.Params.DriverID := lDriverLink.DriverID; 
with LRestoreDB do
begin
   Params.Database := AFBFileName;
   Params.UserName := '***';
   Params.Password := '***';
   LoginPrompt := False;
   // ResourceOptions.KeepConnection is default true
   FetchOptions.Mode := fmAll;
end;
SetFireBirdMapRules(LRestoreDB); // Some mapping rules

怎么回事
我还有什么可以调查的吗?

其他背景信息:

  • INSERT对于许多表,使用参数化查询将数据复制到目标数据库每个表传输周围都有一个显式提交的事务。
  • 在表中复制操作TxOptions.AutoCommit对目标数据库为真
  • Delphi Tokyo 10.2.3 Win32应用程序,Firebird 2.5.3.25778 Win32
  • 该用户在DROP之后遇到了CREATE问题。答案中Mark写道,使用execute语句会添加其他锁iirc,该锁与相同表名的后续DDL冲突那是Firebird 2.1下的PSQL,没有提到嵌入式,并且我没有死锁错误。
马克·罗特·韦尔

您需要在步骤4、5和6(当然还有7)之后执行一次提交。Firebird中的某些DDL仅在提交时才真正执行,因此,如果您在一个事务中运行所有内容,则实际上并不会在步骤3和4中删除并重新创建索引,而在步骤6中的表删除可能会被阻止当您尝试在步骤7中重新创建它时,步骤5中的早期DML和步骤6中的表删除将尚未执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

InvocationTargetException:使用Aion嵌入式AVM时Dapp调用失败

在引用数据更新时更新嵌入式数据

在Firebird脚本中创建表会导致死锁导致“元数据更新失败”

使用嵌入式库进行xcode测试时,手动签名失败。可以分解吗?

当嵌入式密钥包含SQL Server上的标识列时,Hibernate插入失败

当运行带有嵌入式引号(源参数)的命令时,Bash脚本失败

为什么在嵌入式构造函数中访问静态成员时链接器失败

如果请求失败,是否仍然可以使用嵌入式JSON?

使用YTPlayerView在iOS中播放嵌入式YouTube视频失败,出现限制错误

在vue.js中拉伸嵌入式vimeo失败

嵌入式期望脚本返回成功或失败的 bash

大厅管道:如何让嵌入式脚本使管道失败

在MarkLogic中使用xquery更新嵌入式三元组

如何使用嵌入式元数据恢复视频录制的文件时间戳?

使用Mongoose从Node从MongoDB中的复杂嵌入式集合中插入,更新和删除

Gradle项目-无法配置DataSource'url'属性失败,并且无法配置任何嵌入式数据源

尝试使用嵌入式JDK而非自定义安装时,Android Studio显示错误

当嵌入式视频到达特定位置时,使用JavaScript突出显示文本

使用多个 Google 帐户时不显示嵌入式 Google 地图

使用嵌入式Ruby迭代器时,如何有交替的HTML表行类?

使用DT数据表将按钮的javascript功能移动到嵌入式按钮

创建嵌入式视图时未显示图标

PHPSpreadsheet:更新模板时保留嵌入式对象

如何释放数据库文件?(NHibernate和嵌入式Firebird数据库)

更新mongodb中的多嵌入式数据

带有嵌入式数据透视表的多对多

VueJ:使用嵌入式模板从嵌入式组件内部访问数据

使用Underscore删除使用嵌入式数组的对象

Tkinter 中的嵌入式 Matplotlib 图仅在按键事件上按下“g”时使用新数据更新。为什么?