我有使用“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已被删除,并且在数据库中无法再找到。
如果我第三次运行该脚本,则会再次创建表并且不会引发任何错误。
为什么脚本不能删除然后重新创建表?
不允许来自 PSQL 的 DDL,使用EXECUTE STATEMENT
它并没有被直接禁止,并且通常是可能的,但由于此类问题仍然不明智。我不太确定原因,但部分原因与 DDL 更改在 Firebird 中的应用方式有关;使用execute 语句会添加额外的锁iirc,这与同一表名的后续DDL 冲突。
您应该使用 DDL 语句,而不是以这种方式删除和创建RECREATE TABLE https://firebirdsql.org/file/documentation/html/en/refdocs/fblangref25/firebird-25-language-reference.html#fblangref25-ddl-tbl-recreate反而。
注意这个词deadlock这个错误实际上有点用词不当(没有真正的死锁)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)