代码改变世界

Oracle如何找出只授予了查询权限的表

2025-11-04 11:52  潇湘隐者  阅读(3)  评论(0)    收藏  举报

昨天遇到了一个需求,需要找出A用户只授予了B用户查询权限的所有表. 实际情况中, A用户可能将一些表的SELECT,UPDATE, INSERT,DELETE等权限授予用户B,现在我们需要找出A用户下只授予了SELECT权限给B用户的表,那么SQL脚本如何实现呢? 这个是我当时写的一个脚本.分享如下所示:

SET LINESIZE WINDOW
COL OWNER FOR A8
COL OBJECT_NAME FOR A30
COL TYPE FOR A16
COL GRANTEE FOR A12
COL GRANTOR FOR A8
COL PRIVILEGE FOR A16
COL GRANTABLE FOR A8
SELECT T.OWNER
      ,T.TABLE_NAME AS OBJECT_NAME
      ,T.TYPE
      ,T.GRANTOR
      ,T.PRIVILEGE
      ,T.GRANTEE
      ,T.GRANTABLE
FROM DBA_TAB_PRIVS T
INNER JOIN (
    SELECT OWNER
         , TABLE_NAME
         , GRANTEE
         , COUNT(*) 
    FROM  DBA_TAB_PRIVS
    WHERE OWNER=UPPER(TRIM('&grantor_user'))
    GROUP BY OWNER, TABLE_NAME, GRANTEE
    HAVING(COUNT(*)) =1
) L ON T.OWNER= L.OWNER AND T.TABLE_NAME= L.TABLE_NAME AND L.GRANTEE= T.GRANTEE
WHERE T.PRIVILEGE='SELECT' 
AND T.TYPE='TABLE'
AND T.GRANTEE=UPPER(TRIM('&grantee_user'));

注意:: Oracle 18c以下版本,需要用命令SET LINESIZE n 替换SET LINESIZE WINDOW. 这个命令只支持Oracle 18c或以上版本.