des*_*iny 107 sql oracle privileges rules
有人可以告诉我如何在sql-console中显示特定用户的所有权限/规则吗?
Tej*_*eja 153
您可以尝试以下视图.
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
Run Code Online (Sandbox Code Playgroud)
DBA和其他高级用户可以使用DBA_这些相同视图的版本找到授予其他用户的权限.它们包含在文档中.
这些视图仅显示直接授予用户的权限.查找所有权限(包括通过角色间接授予的权限)需要更复杂的递归SQL语句:
select * from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER' order by 1,2,3;
select * from dba_sys_privs where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3;
select * from dba_tab_privs where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3,4;
Run Code Online (Sandbox Code Playgroud)
Jus*_*ave 18
根据你想要的疯狂程度,有各种各样的脚本可以做到这一点.我个人会使用Pete Finnigan的find_all_privs脚本.
如果你想自己编写,那么查询就会变得非常具有挑战性.可以为用户授予可见的系统权限DBA_SYS_PRIVS.可以为它们授予可见的对象权限DBA_TAB_PRIVS.并且他们可以被授予可见的DBA_ROLE_PRIVS角色(角色可以是默认的或非默认的,也可以要求密码,因此仅仅因为用户被授予角色并不意味着用户必须使用他的特权通过默认获得的角色获得).但是,这些角色可以反过来,被授予系统权限,对象权限,而其他角色可以通过查看查看ROLE_SYS_PRIVS,ROLE_TAB_PRIVS和ROLE_ROLE_PRIVS.Pete的脚本遍历这些关系,以显示最终流向用户的所有权限.
虽然Raviteja Vutukuri 的答案有效并且可以快速组合在一起,但它对于改变过滤器并不是特别灵活,并且如果您希望以编程方式执行某些操作,则没有太大帮助。所以我整理了我自己的查询:
SELECT
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME,
LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
FROM (
-- Gets all roles a user has, even inherited ones
WITH ALL_ROLES_FOR_USER AS (
SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
FROM DBA_ROLE_PRIVS
CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
)
SELECT
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME,
REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
ADMIN_OR_GRANT_OPT,
HIERARCHY_OPT
FROM (
-- System privileges granted directly to users
SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
FROM DBA_SYS_PRIVS
WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
UNION ALL
-- System privileges granted users through roles
SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
FROM DBA_SYS_PRIVS
JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
UNION ALL
-- Object privileges granted directly to users
SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, GRANTABLE, HIERARCHY
FROM DBA_TAB_PRIVS
WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
UNION ALL
-- Object privileges granted users through roles
SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, ALL_ROLES_FOR_USER.GRANTED_ROLE AS GRANT_TARGET, GRANTABLE, HIERARCHY
FROM DBA_TAB_PRIVS
JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
) ALL_USER_PRIVS
-- Adjust your filter here
WHERE USERNAME = 'USER_NAME'
) DISTINCT_USER_PRIVS
GROUP BY
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME
;
Run Code Online (Sandbox Code Playgroud)
优点:
WHERE。DBMS_OUTPUT其他东西的函数(与皮特·芬尼根的链接脚本相比)。这使得它对于编程使用和导出非常有用。GRANT。另一个有用的资源
http://psoug.org/reference/roles.html
| 归档时间: |
|
| 查看次数: |
423614 次 |
| 最近记录: |