gpt4 book ai didi

sql - 在 Firebird 脚本中创建表导致 "unsuccessful metadata update"出现死锁

转载 作者:行者123 更新时间:2023-12-04 21:49:16 26 4
gpt4 key购买 nike

我有以下使用“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它不是直接禁止的,通常是可能的,但由于这些问题,它仍然不明智。我不完全确定原因,但部分原因与在 Firebird 中应用 DDL 更改的方式有关; execute 语句的使用添加了额外的锁 iirc,这些锁与相同表名的后续 DDL 冲突。
您应该使用 DDL 语句 RECREATE TABLE 而不是以这种方式删除和创建反而。
请注意,此错误中的死锁一词实际上有点用词不当(没有真正的死锁)。

关于sql - 在 Firebird 脚本中创建表导致 "unsuccessful metadata update"出现死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27442737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com