ฉันจะแสดงรายการทุนทั้งหมดที่ผู้ใช้ได้รับได้อย่างไร?


99

ฉันต้องการดูทุนทั้งหมดบน Oracle DB

ฉันใช้คุณลักษณะ TOAD เพื่อเปรียบเทียบสคีมา แต่ไม่แสดงเงินช่วยเหลือที่ล่อใจเป็นต้นดังนั้นจึงมีคำถามของฉัน:

ฉันจะแสดงรายการทุนทั้งหมดบน Oracle DB ได้อย่างไร

คำตอบ:


143

หากคุณต้องการมากกว่าการให้สิทธิ์ตารางโดยตรง (เช่นการให้สิทธิ์ผ่านบทบาทสิทธิ์ของระบบเช่นเลือกตารางใด ๆ เป็นต้น) ต่อไปนี้เป็นคำถามเพิ่มเติม:

สิทธิ์ของระบบสำหรับผู้ใช้:

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;

1
คุณอาจไม่มีสิทธิ์ดูตาราง sys.dba_sys_privs
Hannes

1
ถูกต้องที่สุด ดู DBA ของคุณ หากพวกเขาปฏิเสธพวกเขาอาจมีข้อกังวลด้านความปลอดภัยที่ชอบด้วยกฎหมาย การดูเนื้อหาของมุมมองเหล่านี้ทำให้มีข้อมูลผู้ใช้ที่พวกเขาไม่สามารถมีได้
DCookie

2
มันจะน่าสนใจที่จะออกจากrole_role_privsโต๊ะแล้วCONNECT BY PRIOR granted_role = roleกลับมารับสิทธิพิเศษในบทบาทสกรรมกริยา ...
Lukas Eder

34

สมมติว่าคุณต้องการแสดงรายการทุนสำหรับวัตถุทั้งหมดที่ผู้ใช้รายใดรายหนึ่งได้รับ :

select * from all_tab_privs_recd where grantee = 'your user'

สิ่งนี้จะไม่ส่งคืนวัตถุที่เป็นของผู้ใช้ หากคุณต้องการใช้all_tab_privsมุมมองแทน


21

ขออภัยพวกคุณ แต่การเลือกจาก 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


12

วิธีที่ครอบคลุมและน่าเชื่อถือที่สุดที่ฉันรู้ยังคงอยู่โดยใช้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;

คำตอบที่น่าสนใจแม้ว่า


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
คำอธิบายบางอย่างจะช่วยให้คำตอบนี้เมื่อมีคนอื่นมาพบ
Andrew Barber

0

แบบสอบถามต่อไปนี้สามารถใช้เพื่อรับสิทธิ์ทั้งหมดของผู้ใช้คนเดียว .. เพียงแค่ระบุชื่อผู้ใช้ในแบบสอบถามแรกและคุณจะได้รับสิทธิ์ทั้งหมด

กับผู้ใช้ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.