使用嵌入式 Firebird 时删除 table 失败并显示 'unsuccessful metadata update'
Dropping table fails with 'unsuccessful metadata update' when using embedded Firebird
我的代码执行以下操作:
- 设置设计时目标
TFDConnection
- 创建一个运行时间源
TFDConnection
- 删除目标中的所有索引和 tables
- 重新创建那些
- 将所有数据从源复制到目标
- 删除其中一个 tables(和索引),命名为
TT_SYS_WEEKS
- 重新创建并填充
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
。
删除和创建 tables/indices 的完全相同的操作已在步骤 3、4、5 中执行。 TT_SYS_WEEKS
不是最后复制的 table。
设计时目标连接及其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
//
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
查询将数据复制到目标数据库,持续许多 table。每次 table 转账都有一个显式提交的事务。
- 在table复制操作中
TxOptions.AutoCommit
对于目标数据库是正确的
- Delphi Tokyo 10.2.3 Win32 应用程序,Firebird 2.5.3.25778 Win32
- This user had an issue with CREATE following DROP. In the answer, Mark 写入 execute 语句的使用添加了额外的锁 iirc,这与相同 table 名称 的后续 DDL 冲突。那是Firebird 2.1下的PSQL,没有提到嵌入式,我也没有死锁错误。
您需要在第 4 步、第 5 步和第 6 步(当然还有第 7 步)之后执行提交。 Firebird 中的某些 DDL 仅在提交时才真正执行,因此如果您 运行 一个事务中的所有内容,您将不会在步骤 3 和 4 中实际删除并重新创建索引,table第 6 步中的 drop 可能会被第 5 步中较早的 DML 阻止,并且当您尝试在第 7 步中重新创建它时,table 第 6 步中的 drop 尚未执行。
我的代码执行以下操作:
- 设置设计时目标
TFDConnection
- 创建一个运行时间源
TFDConnection
- 删除目标中的所有索引和 tables
- 重新创建那些
- 将所有数据从源复制到目标
- 删除其中一个 tables(和索引),命名为
TT_SYS_WEEKS
- 重新创建并填充
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
。
删除和创建 tables/indices 的完全相同的操作已在步骤 3、4、5 中执行。 TT_SYS_WEEKS
不是最后复制的 table。
设计时目标连接及其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
//
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
查询将数据复制到目标数据库,持续许多 table。每次 table 转账都有一个显式提交的事务。 - 在table复制操作中
TxOptions.AutoCommit
对于目标数据库是正确的 - Delphi Tokyo 10.2.3 Win32 应用程序,Firebird 2.5.3.25778 Win32
- This user had an issue with CREATE following DROP. In the answer, Mark 写入 execute 语句的使用添加了额外的锁 iirc,这与相同 table 名称 的后续 DDL 冲突。那是Firebird 2.1下的PSQL,没有提到嵌入式,我也没有死锁错误。
您需要在第 4 步、第 5 步和第 6 步(当然还有第 7 步)之后执行提交。 Firebird 中的某些 DDL 仅在提交时才真正执行,因此如果您 运行 一个事务中的所有内容,您将不会在步骤 3 和 4 中实际删除并重新创建索引,table第 6 步中的 drop 可能会被第 5 步中较早的 DML 阻止,并且当您尝试在第 7 步中重新创建它时,table 第 6 步中的 drop 尚未执行。