ฉันต้องการดูทุนทั้งหมดบน Oracle DB
ฉันใช้คุณลักษณะ TOAD เพื่อเปรียบเทียบสคีมา แต่ไม่แสดงเงินช่วยเหลือที่ล่อใจเป็นต้นดังนั้นจึงมีคำถามของฉัน:
ฉันจะแสดงรายการทุนทั้งหมดบน Oracle DB ได้อย่างไร
ฉันต้องการดูทุนทั้งหมดบน Oracle DB
ฉันใช้คุณลักษณะ TOAD เพื่อเปรียบเทียบสคีมา แต่ไม่แสดงเงินช่วยเหลือที่ล่อใจเป็นต้นดังนั้นจึงมีคำถามของฉัน:
ฉันจะแสดงรายการทุนทั้งหมดบน Oracle DB ได้อย่างไร
คำตอบ:
หากคุณต้องการมากกว่าการให้สิทธิ์ตารางโดยตรง (เช่นการให้สิทธิ์ผ่านบทบาทสิทธิ์ของระบบเช่นเลือกตารางใด ๆ เป็นต้น) ต่อไปนี้เป็นคำถามเพิ่มเติม:
สิทธิ์ของระบบสำหรับผู้ใช้:
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;
role_role_privs
โต๊ะแล้วCONNECT BY PRIOR granted_role = role
กลับมารับสิทธิพิเศษในบทบาทสกรรมกริยา ...
สมมติว่าคุณต้องการแสดงรายการทุนสำหรับวัตถุทั้งหมดที่ผู้ใช้รายใดรายหนึ่งได้รับ :
select * from all_tab_privs_recd where grantee = 'your user'
สิ่งนี้จะไม่ส่งคืนวัตถุที่เป็นของผู้ใช้ หากคุณต้องการใช้all_tab_privs
มุมมองแทน
ขออภัยพวกคุณ แต่การเลือกจาก all_tab_privs_recd โดยที่ grantee = 'ผู้ใช้ของคุณ' จะไม่ให้ผลลัพธ์ใด ๆ ยกเว้นการให้สิทธิ์สาธารณะและการให้สิทธิ์ของผู้ใช้ปัจจุบันหากคุณเรียกใช้การเลือกจากผู้ใช้รายอื่น ตามเอกสารกล่าวว่า
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 เอง) คุณจะไม่สามารถใช้มุมมองระบบนั้นได้
ในกรณีนี้คุณต้องทำการสืบค้นที่ซับซ้อนมากขึ้น นี่คือสิ่งที่นำมา (ติดตาม) จาก 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'
UPD: การศึกษาเอกสารฉันพบอีกมุมมองหนึ่งที่แสดงรายการทุนทั้งหมดในวิธีที่ง่ายกว่ามาก:
select * from DBA_TAB_PRIVS where grantee = 'your user';
โปรดทราบว่าไม่มีมุมมอง DBA_TAB_PRIVS_RECD ใน Oracle
วิธีที่ครอบคลุมและน่าเชื่อถือที่สุดที่ฉันรู้ยังคงอยู่โดยใช้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;
คำตอบที่น่าสนใจแม้ว่า
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')
;
แบบสอบถามต่อไปนี้สามารถใช้เพื่อรับสิทธิ์ทั้งหมดของผู้ใช้คนเดียว .. เพียงแค่ระบุชื่อผู้ใช้ในแบบสอบถามแรกและคุณจะได้รับสิทธิ์ทั้งหมด
กับผู้ใช้ AS (SELECT 'SCHEMA_USER' usr FROM dual), Roles AS (SELECT given_role FROM dba_role_privs rp JOIN users on rp.GRANTEE = users.usr UNION SELECT given_role FROM role_role_privs WHERE GRANTEE = users.usr)), tab_privilage AS (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp บทบาท JOIN r ON rtp.role = r.granted_role UNION SELECT OWNER, TABLE_NAME, PRIVILEGE FROM Dbaee_Tab_PrivINs ผู้ใช้ dtp usr), sys_privileges AS (เลือกสิทธิ์จากผู้ใช้ dba_sys_privs dsp JOIN บน dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY owner, table_name --SELECT * FROM sys_privileges