我正在尝试创建一个存储过程(或触发器,函数,任何东西)来检查数据库中的所有表是否都可访问。
我的想法是获取数据库中的所有表,然后尝试通过简单的选择来访问它们,如果这对所有表成功,那么一切都应该没问题。
我想不出别的什么来解决这个问题,但我不知道该怎么做,或者所有这一切。
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];
虽然没关系,但是如果可以访问所有表,我的数据库就可以了。
有人可以帮我这个吗?这是解决这个问题的正确方法吗?
答案 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