4

我有以下使用“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 已被删除,无法再在数据库中找到。如果我第三次运行该脚本,则会再次创建表并且不会引发任何错误。

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

4

1 回答 1

3

不允许来自 PSQL 的 DDL,也不EXECUTE STATEMENT是直接禁止使用它,而且通常是可能的,但由于这些问题,仍然不明智。我不确定原因,但部分原因与 DDL 更改在 Firebird 中的应用方式有关;使用执行语句会添加额外的锁 iirc,这与相同表名的后续 DDL 冲突。

与其以这种方式删除和创建,不如使用 DDL 语句RECREATE TABLE

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

于 2014-12-12T11:44:24.027 回答