求Oracle SQL脚本:列出对数据库表拥有超只读权限的用户
Oracle SQL脚本:识别拥有表非只读权限的用户
以下脚本可直接查询数据库中对表拥有非只读权限(即除SELECT/READ外,包含INSERT、DELETE、UPDATE、ALTER等权限)的用户:
SELECT DISTINCT grantee AS 用户名, owner AS 表所有者, table_name AS 表名, privilege AS 拥有的非只读权限 FROM dba_tab_privs WHERE privilege NOT IN ('SELECT', 'READ') ORDER BY grantee, owner, table_name;
脚本说明
- 依赖
dba_tab_privs视图:这是Oracle存储所有用户表权限的数据字典视图,需要DBA权限才能查询。若没有DBA权限,可改用all_tab_privs,但仅能看到当前用户有权限访问的对象权限。 DISTINCT关键字:避免同一用户对同一表的同一种权限重复显示。- 过滤条件
privilege NOT IN ('SELECT', 'READ'):直接排除只读类权限,筛选出所有具备修改类权限的记录。
补充:包含角色授权的情况
如果需要排查通过角色间接获得的非只读权限,可使用以下联合查询:
SELECT DISTINCT u.grantee AS 用户名, rtp.owner AS 表所有者, rtp.table_name AS 表名, rtp.privilege AS 拥有的非只读权限 FROM dba_role_privs u JOIN role_tab_privs rtp ON u.granted_role = rtp.role WHERE rtp.privilege NOT IN ('SELECT', 'READ') UNION SELECT DISTINCT grantee AS 用户名, owner AS 表所有者, table_name AS 表名, privilege AS 拥有的非只读权限 FROM dba_tab_privs WHERE privilege NOT IN ('SELECT', 'READ') ORDER BY 用户名, 表所有者, 表名;
该查询会同时覆盖直接授权和通过角色间接授权的情况,确保不会遗漏任何具备非只读权限的用户。
内容的提问来源于stack exchange,提问作者Ray123_68
相关产品推荐
相关产品推荐

