ใครช่วยบอกวิธีแสดงสิทธิ์ / กฎทั้งหมดจากผู้ใช้เฉพาะใน sql-console ได้ไหม
ใครช่วยบอกวิธีแสดงสิทธิ์ / กฎทั้งหมดจากผู้ใช้เฉพาะใน sql-console ได้ไหม
คำตอบ:
คุณสามารถลองดูด้านล่างนี้
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;
มีสคริปต์ต่างๆลอยอยู่รอบ ๆ ที่จะทำเช่นนั้นขึ้นอยู่กับว่าคุณต้องการได้รับบ้าแค่ไหน ผมเองจะใช้พีทฟินนิกันของสคริปต์ find_all_privs
หากคุณต้องการเขียนด้วยตัวเองแบบสอบถามค่อนข้างท้าทาย DBA_SYS_PRIVS
ผู้ใช้จะได้รับสิทธิพิเศษในระบบที่อยู่ในที่มองเห็นได้ พวกเขาสามารถได้รับสิทธิ์ออบเจ็กต์ซึ่งมองเห็นได้ในDBA_TAB_PRIVS
. และสามารถรับบทบาทที่สามารถมองเห็นได้DBA_ROLE_PRIVS
(บทบาทสามารถเป็นค่าเริ่มต้นหรือไม่ใช่ค่าเริ่มต้นและสามารถต้องใช้รหัสผ่านได้เช่นกันดังนั้นเพียงเพราะผู้ใช้ได้รับบทบาทไม่ได้หมายความว่าผู้ใช้จะสามารถใช้สิทธิ์ที่เขาต้องการได้ ได้รับจากบทบาทโดยค่าเริ่มต้น) แต่บทบาทเหล่านั้นสามารถในการเปิดจะได้รับสิทธิพิเศษในระบบสิทธิประโยชน์วัตถุและบทบาทเพิ่มเติมซึ่งสามารถดูได้โดยดูที่ROLE_SYS_PRIVS
, และROLE_TAB_PRIVS
ROLE_ROLE_PRIVS
สคริปต์ของ Pete จะอธิบายถึงความสัมพันธ์เหล่านั้นเพื่อแสดงสิทธิพิเศษทั้งหมดที่ส่งไปยังผู้ใช้
SYS
สิทธิพิเศษและเพียงแค่ต้องการดูสิทธิพิเศษในบัญชีของเราสคริปต์ก็ไร้ค่าอย่างที่สุด ฉันไม่สามารถเข้าถึงUTL_FILE
หรือเข้าถึงDBA_SYS_PRIVS
และอื่น ๆDBA
และSYS
พื้นที่ที่สคริปต์ดู
ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
และROLE_ROLE_PRIVS
ความต้องการที่จะตรวจสอบ เอกสารระบุว่าเป็นของผู้ใช้ปัจจุบัน
แหล่งข้อมูลที่มีประโยชน์อื่น ๆ :
http://psoug.org/reference/roles.html
DBA
หรือSYS
บทบาทและคุณเพียงแค่ต้องการค้นหาสิทธิพิเศษในบัญชีของคุณเอง
แม้ว่าคำตอบของ 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
แบบสอบถามย่อยสามารถจะดึงออกมาถ้าคุณจำเป็นต้องตรวจสอบได้โดยแต่ละUSER_SYS_PRIVS
(สิทธิ์ของระบบที่ได้รับโดยตรง), USER_TAB_PRIVS
(อ็อบเจ็กต์ที่ได้รับโดยตรง) USER_ROLE_PRIVS
(บทบาทที่ได้รับโดยตรงจากผู้ใช้), ROLE_ROLE_PRIVS
(สำหรับการรับบทบาทที่สืบทอดมา), ROLE_SYS_PRIVS
(การกำหนดสิทธิของระบบผ่านบทบาท) และROLE_TAB_PRIVS
(อ็อบเจ็กต์ส่วนตัวผ่านบทบาท) ฮึ. Oracle มีความซับซ้อนมาก
คุณสามารถใช้รหัสด้านล่างเพื่อรับรายการสิทธิพิเศษทั้งหมดจากผู้ใช้ทั้งหมด
select * from dba_sys_privs
เพื่อแสดงสิทธิพิเศษทั้งหมด:
เลือกชื่อจาก system_privilege_map;