回答:
以下のビューを試すことができます。
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;
あなたがどれだけクレイジーになりたいかに応じて、それを行うさまざまなスクリプトが浮かんでいます。個人的には、Pete Finniganの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
検討する必要があります。ドキュメントは、現在のユーザー向けであることを示しています。
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から名前を選択します。