在Firebird脚本中创建表导致"不成功的元数据更新"死锁

时间:2014-12-12 11:30:27

标签: sql firebird firebird2.1

我使用“isql -i scriptfile.sql”运行以下脚本:

CONNECT C:\Databasefile.fdb USER user PASSWORD password;

SET TERM !! ;
EXECUTE BLOCK AS BEGIN
IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'MYTABLE')) THEN
EXECUTE STATEMENT 'DROP TABLE MYTABLE;';
END!!
SET TERM ; !!

CREATE TABLE MYTABLE 
(
  MYCOLUMN      VARCHAR(14) NOT NULL
);

我第一次运行它(当表不存在时)表是按预期创建的。 如果我再次运行脚本,我会收到以下错误:

Statement failed, SQLCODE = -607
unsuccessful metadata update
-STORE RDB$RELATIONS failed
-deadlock
After line 8 in file d:\myscript.sql

当脚本退出时,MYTABLE已被删除,无法再在数据库中找到。 如果我第三次运行该脚本,则会再次创建该表,并且不会抛出任何错误。

为什么脚本不能删除然后重新创建表?

1 个答案:

答案 0 :(得分:3)

不允许来自PSQL的DDL,使用EXECUTE STATEMENT它不是直接被禁止的,并且通常是可能的,但由于这些类型的问题仍然不明智。我不确定原因,但部分原因与Firebird中如何应用DDL更改有关;使用execute语句会添加额外的锁定iirc,它与后续的DDL争用相同的表名。

您应该使用DDL语句RECREATE TABLE而不是删除和创建这种方式。

请注意,此错误中的 deadlock 一词实际上有点用词不当(没有真正的死锁)。