来自RDB $ RELATION_NAME的SQL SELECT动态,用于检查表的完整性

时间:2013-09-30 16:59:22

标签: sql firebird

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

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

我想不出别的什么来解决这个问题,但我不知道该怎么做,或者所有这一切。

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];

虽然没关系,但是如果可以访问所有表,我的数据库就可以了。

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

1 个答案:

答案 0 :(得分:1)

正如a_horse_with_no_name所评论的那样,这是一个非常奇怪的请求......如果您在RDB$RELATIONS中看到该表,您可以非常确定数据库中是否存在该表。如果该表在数据库元数据中列出但实际上不存在则数据库已损坏且您使用select检查其“accessibilty”的想法是没有意义的......此外,该表可能在那里,但是用户可能没有选择权限,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实用程序。