SELECT PRIVILEGE
FROM sys.dba_sys_privs
WHERE grantee = <theUser>
UNION
SELECT PRIVILEGE
FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role)
WHERE rp.grantee = <theUser>
ORDER BY 1;
直接赠款表/视图:
SELECT owner, table_name, select_priv, insert_priv, delete_priv, update_priv, references_priv, alter_priv, index_priv
FROM table_privileges
WHERE grantee = <theUser>
ORDER BY owner, table_name;
对表/视图的间接赠款:
SELECT DISTINCT owner, table_name, PRIVILEGE
FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role)
WHERE rp.grantee = <theUser>
ORDER BY owner, table_name;
select distinct 'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEE
from DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP
on (RP.GRANTED_ROLE = RTP.role)
where (OWNER in ('YOUR USER') --Change User Name
OR RP.GRANTEE in ('YOUR USER')) --Change User Name
and RP.GRANTEE not in ('SYS', 'SYSTEM')
;
WITH users AS
(SELECT 'SCHEMA_USER' usr FROM dual),
Roles AS
(SELECT granted_role
FROM dba_role_privs rp
JOIN users
ON rp.GRANTEE = users.usr
UNION
SELECT granted_role
FROM role_role_privs
WHERE role IN (SELECT granted_role
FROM dba_role_privs rp
JOIN users
ON rp.GRANTEE = users.usr)),
tab_privilage AS
(SELECT OWNER, TABLE_NAME, PRIVILEGE
FROM role_tab_privs rtp
JOIN roles r
ON rtp.role = r.granted_role
UNION
SELECT OWNER, TABLE_NAME, PRIVILEGE
FROM Dba_Tab_Privs dtp
JOIN Users
ON dtp.grantee = users.usr),
sys_privileges AS
(SELECT privilege
FROM dba_sys_privs dsp
JOIN users
ON dsp.grantee = users.usr)
SELECT * FROM tab_privilage ORDER BY owner, table_name
--SELECT * FROM sys_privileges
7条答案
按热度按时间ecfdbz9o1#
要列出授予当前用户(已连接并拥有会话的用户)的所有系统权限,可使用以下查询:
select * from**USER_SYS_PRIVS**where USERNAME = 'arash';
查询应在当前用户会话中执行,并且用户名必须包含引号。例如:
select * from**USER_SYS_PRIVS**where USERNAME = 'arash';
个xlpyo6sf2#
如果您需要的不仅仅是直接表赠款(例如,通过角色授权、系统权限(如选择任意表等)),下面是一些附加查询:
用户的系统权限:
直接赠款表/视图:
对表/视图的间接赠款:
icomxhvb3#
假设您要列出特定用户已 * 收到 * 的所有 * 对象 * 的赠款:
这将不会返回用户拥有的对象。如果需要这些对象,请使用
all_tab_privs
视图。vjhs03f74#
对不起,伙计们,但是如果您从不同的用户(比如说SYS)运行select,那么从all_tab_privs_recd(其中grantee = 'your user')中选择将不会给予任何输出,除了公共赠款和当前用户授权。
ALL_TAB_PRIVS_RECD描述了以下类型的赠款:
因此,如果您是一个DBA,并且希望列出某个特定用户(而不是SYS本身)的所有object赠款,则不能使用该系统视图。
在此情况下,您必须执行更复杂的查询。以下是从TOAD提取(追踪)的查询,以提取特定使用者的所有对象赠款:
这将列出您(指定)用户的所有对象赠款(包括列授权)。如果不需要列级别授权,请删除以'union'子句开头的select语句的所有部分。
UPD:研究文档时,我发现了另一个视图,它以更简单的方式列出了所有赠款:
请记住,Oracle中没有DBA_TAB_PRIVS_RECD视图。
ccgok5k55#
我所知道的最全面、最可靠的方法仍然是使用DBMS_METADATA:
(用户名必须大小写匹配,因此通常应为大写)
不过答案很有趣。
rnmwe5a26#
wsxa1bj17#
以下查询可用于获取一个用户的所有权限...只需在第一个查询中提供用户名,您将获取该用户的所有权限