जवाबों:
आप इन नीचे दिए गए विचारों की कोशिश कर सकते हैं।
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
डीबीए और अन्य बिजली उपयोगकर्ता DBA_
इन समान विचारों के संस्करणों के साथ अन्य उपयोगकर्ताओं को दिए गए विशेषाधिकार पा सकते हैं । वे प्रलेखन में शामिल हैं ।
वे विचार केवल उपयोगकर्ता को सीधे दिए गए विशेषाधिकारों को दिखाते हैं । उन सभी विशेषाधिकारों को ढूंढना , जिनमें भूमिकाओं के माध्यम से अप्रत्यक्ष रूप से दिए गए, अधिक जटिल पुनरावर्ती एसक्यूएल बयानों की आवश्यकता होती है:
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
। पीट की पटकथा उन रिश्तों के माध्यम से चलती है जो सभी विशेषाधिकारों को दिखाती है जो एक उपयोगकर्ता के लिए बहती है।
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
आप केवल अपने खाते के विशेषाधिकारों को खोजना चाहते हैं।
हालांकि रवित्जा वटुकुरी का जवाब काम करता है और एक साथ रखना त्वरित है, यह विशेष रूप से फ़िल्टर को अलग करने के लिए लचीला नहीं है और यदि आप प्रोग्रामेटिक रूप से कुछ करना चाहते हैं तो यह बहुत मदद नहीं करता है। इसलिए मैंने अपनी क्वेरी एक साथ रखी:
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
या कुछ और (पीट फिनिगन की लिंक्ड स्क्रिप्ट की तुलना में) से अलग करता है। यह इसे प्रोग्रामेटिक उपयोग और निर्यात के लिए उपयोगी बनाता है।GRANT
।USER_SYS_PRIVS
(सीधे प्रदान किए गए सिस्टम विशेषाधिकार), USER_TAB_PRIVS
(सीधे दी गई वस्तु निजी) USER_ROLE_PRIVS
(उपयोगकर्ता की सीधे दी गई भूमिकाएं), ROLE_ROLE_PRIVS
(विरासत में मिली भूमिकाओं के लिए), ROLE_SYS_PRIVS
(सिस्टम भूमिकाओं के माध्यम से निजी) और ROLE_TAB_PRIVS
(भूमिकाओं के माध्यम से वस्तु निजी)। ओह। ओरेकल इतना जटिल है।
आप सभी उपयोगकर्ताओं से सभी विशेषाधिकार सूची प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं।
select * from dba_sys_privs
सभी विशेषाधिकार दिखाने के लिए:
system_privilege_map से नाम चुनें;