Câu trả lời:
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;
role_role_privs
bảng và sau đó CONNECT BY PRIOR granted_role = role
để recurse vào đặc quyền vai trò bắc cầu ...
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_privs
chế độ xem thay thế.
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.
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ù.
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')
;
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