Làm cách nào để liệt kê TẤT CẢ các khoản trợ cấp mà người dùng nhận được?


97

Tôi cần xem tất cả các khoản trợ cấp trên Oracle DB.

Tôi đã sử dụng tính năng TOAD để so sánh các lược đồ nhưng nó không hiển thị các khoản trợ cấp tạm thời, v.v. vì vậy, có câu hỏi của tôi:

Làm cách nào để liệt kê tất cả các khoản trợ cấp trên Oracle DB?

Câu trả lời:


141

Nếu bạn muốn nhiều hơn là chỉ cấp trực tiếp bảng (ví dụ: cấp qua vai trò, đặc quyền hệ thống như chọn bảng bất kỳ, v.v.), đây là một số truy vấn bổ sung:

Đặc quyền hệ thống cho người dùng:

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;

Cấp trực tiếp cho bảng / chế độ xem:

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;

Tài trợ gián tiếp cho bảng / chế độ xem:

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;

1
Bạn có thể không có quyền xem bảng sys.dba_sys_privs.
Hannes

1
Chuẩn xác. Xem DBA của bạn. Nếu họ từ chối, họ có thể có những lo ngại về an ninh hợp pháp. Việc xem nội dung của các chế độ xem này cung cấp thông tin người dùng mà họ không thể có.
DCookie

2
Nó sẽ là thú vị để trái tham gia role_role_privsbảng và sau đó CONNECT BY PRIOR granted_role = roleđể recurse vào đặc quyền vai trò bắc cầu ...
Lukas Eder

33

Giả sử bạn muốn liệt kê các khoản trợ cấp trên tất cả các đối tượng mà một người dùng cụ thể đã nhận được :

select * from all_tab_privs_recd where grantee = 'your user'

Điều này sẽ không trả về các đối tượng do người dùng sở hữu. Nếu bạn cần những thứ đó, hãy sử dụng all_tab_privschế độ xem thay thế.


20

Xin lỗi các bạn, nhưng việc chọn từ all_tab_privs_recd, nơi Grantee = 'người dùng của bạn' sẽ không đưa ra bất kỳ đầu ra nào ngoại trừ tài trợ công khai và tài trợ người dùng hiện tại nếu bạn chạy lựa chọn từ một người dùng khác (giả sử SYS). Như tài liệu cho biết,

ALL_TAB_PRIVS_RECD mô tả các loại trợ cấp sau:

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

Vì vậy, nếu bạn là một DBA và muốn liệt kê tất cả các khoản cấp đối tượng cho một người dùng cụ thể (không phải chính SYS), bạn không thể sử dụng chế độ xem hệ thống đó.

Trong trường hợp này, bạn phải thực hiện một truy vấn phức tạp hơn. Đây là một được lấy (theo dấu vết) từ TOAD để chọn tất cả các khoản tài trợ đối tượng cho một người dùng cụ thể:

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;

Điều này sẽ liệt kê tất cả các khoản trợ cấp đối tượng (bao gồm cả các khoản trợ cấp theo cột) cho người dùng (được chỉ định) của bạn. Nếu bạn không muốn trợ cấp cấp cột thì hãy xóa tất cả phần chọn bắt đầu bằng mệnh đề 'union'.

UPD: Nghiên cứu tài liệu, tôi tìm thấy một chế độ xem khác liệt kê tất cả các khoản tài trợ theo cách đơn giản hơn nhiều:

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

Hãy nhớ rằng không có chế độ xem DBA_TAB_PRIVS_RECD trong Oracle.


12

Phương pháp toàn diện và đáng tin cậy nhất mà tôi biết vẫn là sử dụng 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;

Câu trả lời thú vị mặc dù.


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

7
Một số lời giải thích sẽ giúp câu trả lời này, khi những người khác đến và tìm thấy nó.
Andrew Barber

0

Truy vấn sau có thể được sử dụng để nhận tất cả các đặc quyền của một người dùng .. Chỉ cần cung cấp tên người dùng trong truy vấn đầu tiên và bạn sẽ nhận được tất cả các đặc quyền đó

VỚI người dùng AS (CHỌN 'SCHEMA_USER' usr TỪ kép), Vai trò AS (CHỌN CẤP_role TỪ dba_role_privs rp THAM GIA người dùng TRÊN rp.GRANTEE = users.usr LIÊN KẾT CHỌN CẤP_role FROM role_role_privs WHERE vai trò IN (CHỌN CẤP_role TỪ dba_role_privs rp Tham gia người dùng TRÊN rp. GRANTEE = users.usr)), tab_privilage AS (CHỌN CHỦ SỞ HỮU, TABLE_NAME, RIÊNG TƯ TỪ role_tab_privs rtp THAM GIA vai trò r ON rtp.role = r.granted_role LIÊN MINH CHỌN CHỦ SỞ HỮU, TABLE_NAME, CHỦ SỞ HỮU TỪ Dba_Tab_Privs dtp THAM GIA Người dùng TRÊN dtp. usr), sys_privileges AS (CHỌN đặc quyền TỪ dba_sys_privs dsp THAM GIA người dùng TRÊN dsp.grantee = users.usr) CHỌN * TỪ tab_privilage ĐẶT HÀNG BỞI chủ sở hữu, table_name --SELECT * FROM sys_privileges

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.