จะแสดงสิทธิ์ทั้งหมดจากผู้ใช้ใน Oracle ได้อย่างไร?


คำตอบ:


164

คุณสามารถลองดูด้านล่างนี้

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;

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

มุมมองผู้แสดงเฉพาะสิทธิพิเศษที่ได้รับโดยตรงให้กับผู้ใช้ การค้นหาสิทธิพิเศษทั้งหมดรวมถึงสิทธิ์ที่ได้รับทางอ้อมผ่านบทบาทต้องใช้คำสั่ง SQL แบบเรียกซ้ำที่ซับซ้อนมากขึ้น:

select * from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER' order by 1,2,3;
select * from dba_sys_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3;
select * from dba_tab_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3,4;

21

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

หากคุณต้องการเขียนด้วยตัวเองแบบสอบถามค่อนข้างท้าทาย DBA_SYS_PRIVSผู้ใช้จะได้รับสิทธิพิเศษในระบบที่อยู่ในที่มองเห็นได้ พวกเขาสามารถได้รับสิทธิ์ออบเจ็กต์ซึ่งมองเห็นได้ในDBA_TAB_PRIVS. และสามารถรับบทบาทที่สามารถมองเห็นได้DBA_ROLE_PRIVS(บทบาทสามารถเป็นค่าเริ่มต้นหรือไม่ใช่ค่าเริ่มต้นและสามารถต้องใช้รหัสผ่านได้เช่นกันดังนั้นเพียงเพราะผู้ใช้ได้รับบทบาทไม่ได้หมายความว่าผู้ใช้จะสามารถใช้สิทธิ์ที่เขาต้องการได้ ได้รับจากบทบาทโดยค่าเริ่มต้น) แต่บทบาทเหล่านั้นสามารถในการเปิดจะได้รับสิทธิพิเศษในระบบสิทธิประโยชน์วัตถุและบทบาทเพิ่มเติมซึ่งสามารถดูได้โดยดูที่ROLE_SYS_PRIVS, และROLE_TAB_PRIVS ROLE_ROLE_PRIVSสคริปต์ของ Pete จะอธิบายถึงความสัมพันธ์เหล่านั้นเพื่อแสดงสิทธิพิเศษทั้งหมดที่ส่งไปยังผู้ใช้


สคริปต์นั้นยอดเยี่ยมเพียงแค่ลองดู
I.Tyger

1
คุณต้องมีสิทธิ์ในแพ็คเกจ UTL_FILE มิฉะนั้นคุณจะได้รับข้อผิดพลาดเมื่อเรียกใช้สคริปต์ของ Pete Finnigan: "ต้องประกาศตัวระบุ 'UTL_FILE'" คุณสามารถเชื่อมต่อเป็น sys กับ roll sysdba ผ่าน SQL Developer จากนั้นมันจะทำงานหรือให้สิทธิ์ดำเนินการกับแพ็คเกจนี้ด้วยตัวคุณเองโดยใช้: ให้สิทธิ์ดำเนินการบน UTL_FILE ให้กับ <user>;
ม.ค.

1
และสำหรับพวกเราที่ไม่มีSYSสิทธิพิเศษและเพียงแค่ต้องการดูสิทธิพิเศษในบัญชีของเราสคริปต์ก็ไร้ค่าอย่างที่สุด ฉันไม่สามารถเข้าถึงUTL_FILEหรือเข้าถึงDBA_SYS_PRIVSและอื่น ๆDBAและSYSพื้นที่ที่สคริปต์ดู
vapcguy

ฉันไม่คิดว่าROLE_SYS_PRIVS, ROLE_TAB_PRIVSและROLE_ROLE_PRIVSความต้องการที่จะตรวจสอบ เอกสารระบุว่าเป็นของผู้ใช้ปัจจุบัน
jpmc26

หากใครมีสำเนาของสคริปต์เหล่านี้พวกเขาสามารถโพสต์ที่นี่หรือที่อื่น ๆ ที่เขียวชอุ่มตลอดปีเช่นส่วนสำคัญได้หรือไม่? ไซต์ไม่ทำงาน
Michael Thompson

7

แหล่งข้อมูลที่มีประโยชน์อื่น ๆ :

http://psoug.org/reference/roles.html

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS

2
ยกเว้นในกรณีที่คุณไม่มีDBAหรือSYSบทบาทและคุณเพียงแค่ต้องการค้นหาสิทธิพิเศษในบัญชีของคุณเอง
vapcguy

2

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

SELECT
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME,
    LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
    MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
    MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
FROM (
    -- Gets all roles a user has, even inherited ones
    WITH ALL_ROLES_FOR_USER AS (
        SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
        FROM DBA_ROLE_PRIVS
        CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
    )
    SELECT
        PRIVILEGE,
        OBJ_OWNER,
        OBJ_NAME,
        USERNAME,
        REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
        ADMIN_OR_GRANT_OPT,
        HIERARCHY_OPT
    FROM (
        -- System privileges granted directly to users
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- System privileges granted users through roles
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
        UNION ALL
        -- Object privileges granted directly to users
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- Object privileges granted users through roles
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, ALL_ROLES_FOR_USER.GRANTED_ROLE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
    ) ALL_USER_PRIVS
    -- Adjust your filter here
    WHERE USERNAME = 'USER_NAME'
) DISTINCT_USER_PRIVS
GROUP BY
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME
;

ข้อดี:

  • ฉันสามารถกรองข้อมูลต่างๆมากมายเช่นวัตถุสิทธิ์พิเศษไม่ว่าจะผ่านบทบาทเฉพาะ ฯลฯ เพียงแค่เปลี่ยนข้อมูลนั้น WHEREประโยคนั้น
  • เป็นแบบสอบถามเดียวหมายความว่าฉันไม่จำเป็นต้องรวบรวมผลลัพธ์ด้วยกัน
  • แก้ไขปัญหาว่าพวกเขาสามารถให้สิทธิ์ได้หรือไม่และรวมถึงสิทธิ์สำหรับวัตถุย่อย (ส่วน "ลำดับชั้น") ในแหล่งที่มาที่แตกต่างกันของสิทธิ์หรือไม่
  • มันง่ายที่จะเห็นทุกสิ่งที่ฉันต้องทำเพื่อยกเลิกสิทธิ์เนื่องจากจะแสดงแหล่งที่มาทั้งหมดของสิทธิ์
  • มันรวมสิทธิ์ของตารางและระบบไว้ในมุมมองเดียวที่เชื่อมโยงกันทำให้เราสามารถแสดงรายการทั้งหมดได้สิทธิพิเศษของผู้ใช้ในคราวเดียว
  • มันเป็นคำค้นหาไม่ใช่ฟังก์ชันที่พ่นออกมาทั้งหมดนี้DBMS_OUTPUTหรืออะไรบางอย่าง (เทียบกับสคริปต์ที่เชื่อมโยงของ Pete Finnigan) ทำให้มีประโยชน์สำหรับการใช้งานแบบเป็นโปรแกรมและสำหรับการส่งออก
  • ตัวกรองไม่ซ้ำ ปรากฏเพียงครั้งเดียว สิ่งนี้ทำให้ง่ายต่อการเปลี่ยนแปลง
  • GRANTแบบสอบถามย่อยสามารถจะดึงออกมาถ้าคุณจำเป็นต้องตรวจสอบได้โดยแต่ละ

สิ่งที่ต้องทำบางอย่างสำหรับตัวฉันเอง: 1. เพิ่มตัวบ่งชี้ว่าผู้ใช้สามารถให้สิทธิ์ได้หรือไม่โดยการมอบบทบาทให้กับผู้ใช้รายอื่น 2. ดูวิธีดำเนินการสำหรับผู้ใช้ปัจจุบันที่ไม่มีสิทธิ์ DBA อาจเกี่ยวข้องกับUSER_SYS_PRIVS(สิทธิ์ของระบบที่ได้รับโดยตรง), USER_TAB_PRIVS(อ็อบเจ็กต์ที่ได้รับโดยตรง) USER_ROLE_PRIVS(บทบาทที่ได้รับโดยตรงจากผู้ใช้), ROLE_ROLE_PRIVS(สำหรับการรับบทบาทที่สืบทอดมา), ROLE_SYS_PRIVS(การกำหนดสิทธิของระบบผ่านบทบาท) และROLE_TAB_PRIVS(อ็อบเจ็กต์ส่วนตัวผ่านบทบาท) ฮึ. Oracle มีความซับซ้อนมาก
jpmc26

1

คุณสามารถใช้รหัสด้านล่างเพื่อรับรายการสิทธิพิเศษทั้งหมดจากผู้ใช้ทั้งหมด

select * from dba_sys_privs 

นี่ไม่ได้แสดงรายการสิทธิพิเศษทั้งหมด ในฐานะที่เป็นแสดงให้เห็นโดยหลายคำตอบอื่น ๆ ที่นำโดยคุณปีก็ละเว้นสิทธิ์ของตารางและสิทธิพิเศษทั้งหมดได้รับบทบาท
jpmc26

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