如何处理显然既存在又不存在的 Firebird 表

问题描述 投票:0回答:2

我刚刚使用 Firebird 数据库发生了一些非常奇怪的事情。

我试图创建一个表,但由于某种原因 CREATE TABLE 失败了。但现在却陷入了一种很奇怪的状态:

如果我尝试使用相同的表名称再次

CREATE TABLE
,则会出现错误:该表已存在。但是,如果我尝试
DROP TABLE
该表,则会出现错误:该表不存在。尝试
SELECT * FROM
该表给出“表不存在”错误,并且该名称未显示在元数据查询中:

SELECT RDB$RELATION_NAME
  FROM RDB$RELATIONS
 WHERE RDB$SYSTEM_FLAG=0

因此,出于某种原因,该表似乎确实不存在,但我无法创建它,因为某处的某些内容表明它确实存在。

有人知道如何解决这个问题吗?我已经尝试关闭与该数据库的所有连接,这在过去有助于解决不一致问题,但这次没有帮助。

sql firebird
2个回答
2
投票

您没有提供有关尝试创建表时出现的错误的详细信息,因此我无法对其进行评论。但是

RDB$RELATIONS
并不是创建表时受影响的唯一系统表。也许您现在处于不一致的情况,其中有关该表的某些信息存在于某些系统表中,而在其他系统表中不存在。

另一个选项是系统表中的索引损坏,因此记录不存在,但索引认为它仍然存在。

尝试进行备份/恢复,看看是否有帮助。如果它不起作用,请尝试在其他系统表(

RDB$RELATION_FIELDS
等)中搜索与该“未创建”表相关的记录,如果找到任何记录,请尝试删除它们。

作为最后一个选项,您可以使用正确的元数据创建一个新的干净数据库,并使用

IBDataPump
将数据注入其中。


0
投票

我有一个非常类似的问题,所以我希望我可以回答你的问题。我还创建了一个表“MyTable”,并认为它可能未完全创建。

CREATE TABLE MyTable [...];
SHOW TABLES;

显示表的名称。

SELECT * FROM MyTable;

结果:

Statement failed, SQLSTATE = 42S02
Dynamic SQL Error
-SQL error code = -204
-Table unknown
-MYTABLE
-At line 1, column 15

同样的问题

DROP TABLE MyTable

我尝试

gfix
修复“损坏”的数据库,但无济于事。

我发现我的表名带有

SELECT RDB$RELATION_NAME FROM RDB$RELATIONS;
,所以我尝试了
DELETE FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = 'MyTable';
,这是不允许的,即使对于用户 SYSDBA 也是如此。

但是您的问题描述有一个区别:

SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE RDB$SYSTEM_FLAG=0

返回了我的桌子的名字。这就是为什么我不确定我所描述的问题是否与您的问题相同。

我的解决方案

事实证明我只是没有 rtfm 以及它所说的关于双引号的内容。以大写形式显示表名的错误消息应该已经泄露了它。我必须将表的名称放在双引号中才能使命令起作用:

SHOW TABLE "MyTable";
SELECT * FROM "MyTable";
DROP TABLE "MyTable";
© www.soinside.com 2019 - 2024. All rights reserved.