找回密码
 立即注册
首页 业界区 安全 ORACLE如何用一个脚本找出一个用户的授权信息? ...

ORACLE如何用一个脚本找出一个用户的授权信息?

洪势 4 天前
在平时的数据库运维管理过程中,我们可能会遇到很多权限管理相关的需求,例如,有时候需要给一个用户授予相关权限或回收相关权限,那么可能先要把用户授予的权限查询/例举出来, 有时候需要对比DEV/UAT环境,两个相同账号的权限是否不一致......,其实各种权限相关需求还是非常多的,这里就不一一例举了。工欲善其事必先利其器,我们就需要一个SQL语句能够方便、快速,且全面列出用户相关权限(角色、系统权限,对象权限...)。下面分享、介绍这样的一个SQL ,希望这个SQL能满足你的需求。
我们在测试环境创建一个用户TEST,然后在这个用户下面创建一些表,如下所示
  1. SQL> CREATE USER TEST IDENTIFIED BY "Test#13579";
  2. User created.
  3. SQL> GRANT CONNECT TO TEST;
  4. Grant succeeded.
  5. SQL> GRANT CREATE TABLE, CREATE VIEW TO TEST;
  6. Grant succeeded.
  7. SQL>
  8. ---创建相关表对象等语句略过
  9. .................................................
  10. .................................................
复制代码
如下所示,我们来查询一下账户TEST授予的相关权限,如下截图所示:
1.jpeg

然后我们创建一个用户TEST1,授予下面相关权限,如下所示
  1. SQL> CREATE USER TEST1 IDENTIFIED BY "Test#24680";
  2. User created.
  3. SQL> GRANT CONNECT TO TEST1;
  4. Grant succeeded.
  5. SQL> GRANT CREATE TABLE, CREATE VIEW,CREATE SYNONYM TO TEST1;
  6. Grant succeeded.
  7. SQL> GRANT SELECT ,UPDATE, DELETE ON TEST.T1 TO TEST1;
  8. Grant succeeded.
  9. SQL> GRANT UPDATE(OBJECT_ID, OBJECT_NAME) ON TEST.T2 TO TEST1;
  10. Grant succeeded.
  11. SQL> GRANT SELECT ON TEST.V_T1 TO TEST1;
  12. Grant succeeded.
  13. SQL>
复制代码
然后,我们此时查询一下账号TEST1授予的相关权限,如下截图所示:
2.jpeg

如上两个例子所示,这个脚本还是非常方便、明了的。脚本find_user_right_info.sql的定义如下所示:
  1. /*-*****************************************************************************************************************
  2. Script Name     :    find_user_right_info.sql
  3. Author          :    潇湘隐者
  4. Script Function :    查看某个用户被授予的所有权限.
  5. Description     :    如果你想找出某一个用户授予的相关权限,那么可以使用这个脚本.
  6. ********************************************************************************************************************
  7. Parameters      :                                    参数说明
  8. --------------------------------------------------------------------------------------------------------------------
  9. &USERNAME            数据库用户/账号
  10. ********************************************************************************************************************
  11. 注意事项:
  12.     1: 请用sys/system账号运行脚本.
  13. ********************************************************************************************************************
  14. Modified Date    Modified User     Version                 Modified Reason
  15. --------------------------------------------------------------------------------------------------------------------
  16. 2024-06-28        潇湘隐者          1.0                    创建此脚本。
  17. 2025-01-06        潇湘隐者          1.1                    脚本输出结果格式优化/调优
  18. 2025-08-28        潇湘隐者          1.2                    增加列权限输出
  19. ********************************************************************************************************************/
  20. SET LINESIZE 720
  21. SET PAGESIZE 60
  22. COL PRIV_TYPE FOR A9
  23. COL PRIVILEGE FOR A16
  24. COL OBJ_OWNER FOR A10
  25. COL OBJ_NAME FOR A30
  26. COL USERNAME FOR A14
  27. COL GRANT_SOURCES FOR A16
  28. COL ADMIN_OPTION FOR A10
  29. COL HIERARCHY FOR A10
  30. SELECT
  31.     PRIV_TYPE,
  32.     PRIVILEGE,
  33.     OBJ_OWNER,
  34.     OBJ_NAME,
  35.     LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
  36.     USERNAME,
  37.     MAX(ADMIN_OPTION) AS ADMIN_OPTION,    -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
  38.     MAX(HIERARCHY) AS HIERARCHY           -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
  39. FROM (
  40.     -- gets all roles a user has, even inherited ones
  41.     WITH RU AS (
  42.         SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
  43.         FROM DBA_ROLE_PRIVS
  44.         CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
  45.     )
  46.     SELECT
  47.           PRIV_TYPE,
  48.           PRIVILEGE,
  49.           OBJ_OWNER,
  50.           OBJ_NAME,
  51.           USERNAME,
  52.           REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
  53.           ADMIN_OPTION,
  54.           HIERARCHY
  55.     FROM (
  56.         -- system privileges granted directly to users
  57.         SELECT 'SYSTEM'         AS PRIV_TYPE
  58.              , PRIVILEGE        AS PRIVILEGE
  59.              , '---'            AS OBJ_OWNER
  60.              , '---'            AS OBJ_NAME
  61.              , GRANTEE          AS USERNAME
  62.              , GRANTEE          AS GRANT_TARGET
  63.              , ADMIN_OPTION     AS ADMIN_OPTION
  64.              , NULL             AS HIERARCHY
  65.         FROM DBA_SYS_PRIVS
  66.         WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
  67.         UNION ALL
  68.         -- system privileges granted users through roles
  69.         SELECT 'ROLE'           AS PRIV_TYPE
  70.              , GRANTED_ROLE     AS PRIVILEGE
  71.              , '---'            AS OBJ_OWNER
  72.              , '---'            AS OBJ_NAME
  73.              , GRANTEE          AS USERNAME
  74.              , GRANTEE          AS GRANT_TARGET
  75.              , ADMIN_OPTION     AS ADMIN_OPTION
  76.              , NULL             AS HIERARCHY
  77.         FROM DBA_ROLE_PRIVS RP
  78.         INNER JOIN DBA_ROLES R ON RP.GRANTED_ROLE = R.ROLE
  79.         --FROM DBA_SYS_PRIVS
  80.         --JOIN RU ON RU.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
  81.         UNION ALL
  82.         -- object privileges granted directly to users
  83.         SELECT P.TYPE           AS PRIV_TYPE
  84.              , P.PRIVILEGE      AS PRIVILEGE
  85.              , P.OWNER          AS OBJ_OWNER
  86.              , P.TABLE_NAME     AS OBJ_NAME
  87.              , P.GRANTEE        AS USERNAME
  88.              , P.GRANTEE        AS GRANT_TARGET
  89.              , P.GRANTABLE      AS ADMIN_OPTION
  90.              , P.HIERARCHY      AS HIERARCHY
  91.         FROM DBA_TAB_PRIVS P
  92.         WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
  93.         UNION ALL
  94.         -- object privileges granted users through roles
  95.         SELECT 'ROLE'           AS PRIV_TYPE
  96.              , PRIVILEGE        AS PRIVILEGE
  97.              , OWNER            AS OBJ_OWNER
  98.              , TABLE_NAME       AS OBJ_NAME
  99.              , RU.GRANTED_USER  AS USERNAME
  100.              , RU.GRANTED_ROLE  AS GRANT_TARGET
  101.              , GRANTABLE        AS ADMIN_OPTION
  102.              , HIERARCHY        AS HIERARCHY
  103.         FROM DBA_TAB_PRIVS
  104.         JOIN RU ON RU.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
  105.         UNION ALL
  106.         -- column privileges granted directly to users
  107.         SELECT  'COLUMN'        AS PRIV_TYPE
  108.                ,PRIVILEGE       AS PRIVILEGE
  109.                ,OWNER           AS OBJ_OWNER
  110.                ,TABLE_NAME||'(' || COLUMN_NAME ||')'
  111.                                 AS OBJ_NAME
  112.                ,GRANTEE         AS USERNAME
  113.                ,GRANTEE         AS GRANT_TARGET
  114.                ,GRANTABLE       AS ADMIN_OPTION
  115.                ,INHERITED       AS INHERITED
  116.         FROM DBA_COL_PRIVS
  117.         WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
  118.     ) ALL_USER_PRIVS
  119.     WHERE USERNAME = UPPER(TRIM('&USERNAME'))
  120. ) DISTINCT_USER_PRIVS
  121. GROUP BY
  122.     PRIV_TYPE,
  123.     PRIVILEGE,
  124.     OBJ_OWNER,
  125.     OBJ_NAME,
  126.     USERNAME
  127. ;
复制代码
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册