如何无需逐个排查获取DB2中有权限访问的所有表列表?
获取DB2中你有权限访问的所有表
当然不用逐个排查!DB2自带的系统目录视图就能帮你一次性找出当前授权ID能访问的所有表,完全不用挨个试错。下面给你几个实用的查询语句,按需选用:
基础版:只列出能SELECT的表
如果你只需要知道哪些表可以查询,直接跑这个SQL就行:
SELECT tabschema AS SCHEMA_NAME, tabname AS TABLE_NAME FROM SYSCAT.TABLES WHERE -- 检查当前用户或所属组是否有SELECT权限 EXISTS ( SELECT 1 FROM SYSCAT.TABAUTH WHERE TABAUTH.tabschema = TABLES.tabschema AND TABAUTH.tabname = TABLES.tabname AND (authid = CURRENT_USER OR authid IN (SELECT grantee FROM SYSCAT.GROUPS WHERE grantor = CURRENT_USER)) AND SELECTAUTH = 'Y' ) -- 加上自己schema下的所有表(默认你对自己的表有全权限) OR tabschema = CURRENT_USER ORDER BY SCHEMA_NAME, TABLE_NAME;
语句说明:
SYSCAT.TABLES是DB2存储所有表元数据的系统视图,包含库中所有schema和表的信息SYSCAT.TABAUTH专门存储表级权限,我们用它过滤出有SELECT权限的表CURRENT_USER会自动替换成你的授权ID,不用手动修改账号名- 最后一行的判断是个小技巧,确保不会漏掉你自己创建的schema里的所有表
进阶版:查看每个表的具体权限
如果想知道对每个表除了SELECT,还有没有INSERT/UPDATE/DELETE权限,用这个查询:
SELECT t.tabschema AS SCHEMA_NAME, t.tabname AS TABLE_NAME, CASE a.selectauth WHEN 'Y' THEN '是' ELSE '否' END AS 可查询, CASE a.insertauth WHEN 'Y' THEN '是' ELSE '否' END AS 可插入, CASE a.updateauth WHEN 'Y' THEN '是' ELSE '否' END AS 可更新, CASE a.deleteauth WHEN 'Y' THEN '是' ELSE '否' END AS 可删除 FROM SYSCAT.TABLES t LEFT JOIN SYSCAT.TABAUTH a ON t.tabschema = a.tabschema AND t.tabname = a.tabname AND (a.authid = CURRENT_USER OR a.authid IN (SELECT grantee FROM SYSCAT.GROUPS WHERE grantor = CURRENT_USER)) WHERE a.selectauth = 'Y' OR t.tabschema = CURRENT_USER ORDER BY SCHEMA_NAME, TABLE_NAME;
几个注意事项:
- 这些查询需要你对
SYSCAT下的视图有基本访问权限,普通用户默认都有;如果还是报SQLCODE=-551,那得找DBA给你开SELECT ON SYSCAT.TABLES和SELECT ON SYSCAT.TABAUTH的权限 - 如果你的账号属于多个用户组,
SYSCAT.GROUPS会自动关联所有你所属的组权限,不会漏过任何有权限的表
补充:你遇到的
SQLCODE=-551就是典型的权限不足错误,用上面的查询直接过滤掉无权限的表,再也不用挨个踩坑啦。
内容的提问来源于stack exchange,提问作者d_w
相关产品推荐
相关产品推荐

