1

我正在尝试创建一个存储过程(或触发器、函数等)来检查数据库中的所有表是否都可以访问。

我的想法是获取数据库中的所有表,然后尝试通过简单的选择来访问它们,如果所有表都成功,那么一切都应该没问题。

我想不出任何其他方法来解决这个问题,但我不知道该怎么做,或者所有这些。

1 - 获取我所做的所有表名:

SELECT RDB$RELATION_NAME TABLE
    FROM RDB$RELATIONS
    WHERE RDB$VIEW_BLR IS NULL 
    AND (RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0)
    ORDER BY TABLE

现在我只需要为SELECT每个表创建语句,然后运行一个查询:

SELECT FIRST 1 * FROM [TABLE];

虽然没关系,但它继续,如果所有表都可以访问,我的数据库没问题。

有人可以帮我吗?这是解决这个问题的正确方法吗?

4

1 回答 1

1

正如 a_horse_with_no_name 所评论的那样,这真是一个奇怪的要求……如果您看到表中的表,RDB$RELATIONS您可以确定该表存在于数据库中。如果该表列在数据库元数据中但实际上不存在,则该数据库已损坏,并且您select用于检查其“可访问性”的想法毫无意义...此外,该表可能存在但用户可能没有选择对了,IOW 你也需要考虑用户权限。

无论如何,您可以使用EXECUTE STATEMENT来执行动态构建的 DSQL 语句,例如

declare stmt varchar(1024);
declare ctab varchar(31);
BEGIN
  FOR SELECT RDB$RELATION_NAME
      FROM RDB$RELATIONS
      WHERE RDB$VIEW_BLR IS NULL AND (RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0)
  INTO :ctab DO BEGIN
     stmt = 'select ... from ' || ctab; 
     execute statement stmt;
  END;
END

要检查数据库是否损坏,您应该使用带有选项的gfix实用程序。-validate

于 2013-09-30T21:19:07.633 回答