oracle 如何列出用户收到的所有赠款?

omvjsjqw  于 2022-11-03  发布在  Oracle
关注(0)|答案(7)|浏览(104)

我需要查看Oracle数据库上的所有赠款。
我使用TOAD特性来比较模式,但它不显示可尝试的赠款等,所以我有一个问题:
如何列出Oracle DB上的所有赠款?

ecfdbz9o

ecfdbz9o1#

要列出授予当前用户(已连接并拥有会话的用户)的所有系统权限,可使用以下查询:
select * from**USER_SYS_PRIVS**where USERNAME = 'arash';
查询应在当前用户会话中执行,并且用户名必须包含引号。例如:
select * from**USER_SYS_PRIVS**where USERNAME = 'arash';

xlpyo6sf

xlpyo6sf2#

如果您需要的不仅仅是直接表赠款(例如,通过角色授权、系统权限(如选择任意表等)),下面是一些附加查询:
用户的系统权限:

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;
icomxhvb

icomxhvb3#

假设您要列出特定用户已 * 收到 * 的所有 * 对象 * 的赠款:

select * from all_tab_privs_recd where grantee = 'your user'

这将不会返回用户拥有的对象。如果需要这些对象,请使用all_tab_privs视图。

vjhs03f7

vjhs03f74#

对不起,伙计们,但是如果您从不同的用户(比如说SYS)运行select,那么从all_tab_privs_recd(其中grantee = 'your user')中选择将不会给予任何输出,除了公共赠款和当前用户授权。
ALL_TAB_PRIVS_RECD描述了以下类型的赠款:

Object grants for which the current user is the grantee
Object grants for which an enabled role or PUBLIC is the grantee

因此,如果您是一个DBA,并且希望列出某个特定用户(而不是SYS本身)的所有object赠款,则不能使用该系统视图。
在此情况下,您必须执行更复杂的查询。以下是从TOAD提取(追踪)的查询,以提取特定使用者的所有对象赠款:

select tpm.name privilege,
       decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
       ue.name grantee,
       ur.name grantor,
       u.name owner,
       decode(o.TYPE#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
                       4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                       7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                       11, 'PACKAGE BODY', 12, 'TRIGGER',
                       13, 'TYPE', 14, 'TYPE BODY',
                       19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
                       22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
                       28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE',
                       32, 'INDEXTYPE', 33, 'OPERATOR',
                       34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION',
                       40, 'LOB PARTITION', 41, 'LOB SUBPARTITION',
                       42, 'MATERIALIZED VIEW',
                       43, 'DIMENSION',
                       44, 'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN',
                       66, 'JOB', 67, 'PROGRAM', 74, 'SCHEDULE',
                       48, 'CONSUMER GROUP',
                       51, 'SUBSCRIPTION', 52, 'LOCATION',
                       55, 'XML SCHEMA', 56, 'JAVA DATA',
                       57, 'EDITION', 59, 'RULE',
                       62, 'EVALUATION CONTEXT',
                       'UNDEFINED') object_type,
       o.name object_name,
       '' column_name
        from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
             table_privilege_map tpm
        where oa.obj# = o.obj#
          and oa.grantor# = ur.user#
          and oa.grantee# = ue.user#
          and oa.col# is null
          and oa.privilege# = tpm.privilege
          and u.user# = o.owner#
          and o.TYPE# in (2, 4, 6, 9, 7, 8, 42, 23, 22, 13, 33, 32, 66, 67, 74, 57)
  and ue.name = 'your user'
  and bitand (o.flags, 128) = 0
union all -- column level grants
select tpm.name privilege,
       decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
       ue.name grantee,
       ur.name grantor,
       u.name owner,
       decode(o.TYPE#, 2, 'TABLE', 4, 'VIEW', 42, 'MATERIALIZED VIEW') object_type,
       o.name object_name,
       c.name column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
     sys.col$ c, table_privilege_map tpm
where oa.obj# = o.obj#
  and oa.grantor# = ur.user#
  and oa.grantee# = ue.user#
  and oa.obj# = c.obj#
  and oa.col# = c.col#
  and bitand(c.property, 32) = 0 /* not hidden column */
  and oa.col# is not null
  and oa.privilege# = tpm.privilege
  and u.user# = o.owner#
  and o.TYPE# in (2, 4, 42)
  and ue.name = 'your user'
  and bitand (o.flags, 128) = 0;

这将列出您(指定)用户的所有对象赠款(包括列授权)。如果不需要列级别授权,请删除以'union'子句开头的select语句的所有部分。
UPD:研究文档时,我发现了另一个视图,它以更简单的方式列出了所有赠款:

select * from DBA_TAB_PRIVS where grantee = 'your user';

请记住,Oracle中没有DBA_TAB_PRIVS_RECD视图。

ccgok5k5

ccgok5k55#

我所知道的最全面、最可靠的方法仍然是使用DBMS_METADATA

select dbms_metadata.get_granted_ddl( 'SYSTEM_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'OBJECT_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'ROLE_GRANT', :username ) from dual;

(用户名必须大小写匹配,因此通常应为大写)
不过答案很有趣。

rnmwe5a2

rnmwe5a26#

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')
;
wsxa1bj1

wsxa1bj17#

以下查询可用于获取一个用户的所有权限...只需在第一个查询中提供用户名,您将获取该用户的所有权限

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

相关问题