Oracleのユーザーからすべての権限を表示するにはどうすればよいですか?


113

誰かが私にsql-consoleで特定のユーザーからのすべての特権/ルールを表示する方法を教えてもらえますか?

回答:


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

あなたがどれだけクレイジーになりたいかに応じて、それを行うさまざまなスクリプトが浮かんでいます。個人的には、Pete Finniganのfind_all_privsスクリプトを使用します

自分で書きたい場合、クエリはかなり難しくなります。に表示されるシステム権限をユーザーに付与できますDBA_SYS_PRIVS。に表示されるオブジェクト権限を付与できますDBA_TAB_PRIVS。そして、それらはに表示されるロールを付与することができますDBA_ROLE_PRIVS(ロールはデフォルトまたは非デフォルトであり、パスワードも必要とする可能性があるため、ユーザーにロールが付与されているからといって、ユーザーが必ずしも自分の特権を使用できるわけではありませんデフォルトで役割を介して取得されます)。しかし、それらの役割は、順番に、を見て、見ることができるシステム権限、オブジェクト権限、および追加の役割を付与することができROLE_SYS_PRIVSROLE_TAB_PRIVSROLE_ROLE_PRIVS。ピートのスクリプトはそれらの関係をウォークスルーして、ユーザーに流れてしまうすべての特権を示します。


スクリプトは素晴らしいです。チェックアウトしたばかりです
I.Tyger 14年

1
UTL_FILEパッケージに対する権限が必要です。そうでない場合、Pete Finniganのスクリプトを実行するとエラーが発生します:「識別子 'UTL_FILE'を宣言する必要があります」。SQL Developerを介してロールsysdbaでsysとして接続すると、次のコマンドを使用して機能するか、このパッケージへの実行権限を自分に付与します。
1

1
SYS特権を持たず、自分のアカウントの特権を見たいだけの人にとって、スクリプトはまったく価値がありません。私はへのアクセス権がありませんUTL_FILEたりするDBA_SYS_PRIVSと、他のDBASYSでエリアスクリプトルックスを。
vapcguy

私は考えていないROLE_SYS_PRIVSROLE_TAB_PRIVSROLE_ROLE_PRIVS検討する必要があります。ドキュメントは、現在のユーザー向けであることを示しています。
jpmc26 2018

誰かがこれらのスクリプトのコピーを持っている場合、彼らはここまたはどこかに要点のようなもう少し常緑樹を投稿できますか?サイトがダウンしています。
Michael Thompson


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
;

利点:

  • その1つのWHERE句を変更するだけで、オブジェクト、特権、特定のロールによるものかどうかなど、さまざまな情報で簡単にフィルタリングできます。
  • これは単一のクエリです。つまり、結果を精神的にまとめる必要はありません。
  • これにより、権限を付与できるかどうか、および権限のさまざまなソースにわたるサブオブジェクト(「階層」部分)の権限が含まれるかどうかの問題が解決されます。
  • 特権のすべてのソースがリストされているため、特権を取り消すために必要なすべてのことを簡単に確認できます。
  • テーブルとシステムの権限を1つの一貫したビューに組み合わせて、ユーザーのすべての権限を一挙に一覧表示できます。
  • これはクエリであり、これらすべてをDBMS_OUTPUT何かに放出する関数ではありません(Pete Finniganのリンクされたスクリプトと比較して)。これにより、プログラムによる使用やエクスポートに役立ちます。
  • フィルターは繰り返されません。一度だけ表示されます。これにより、変更が容易になります。
  • サブクエリは、個人ごとに調べる必要がある場合、簡単に引き出すことができますGRANT

自分用のいくつかのTODO:1.ユーザーが別のユーザーにロールを付与することで特権を付与できるかどうかを示すインジケーターを追加します。2. DBA権限を持たない現在のユーザーに対してこれを行う方法を理解します。おそらく、USER_SYS_PRIVS(直接付与されたシステム特権)、USER_TAB_PRIVS(直接付与されたオブジェクト特権)USER_ROLE_PRIVS(ユーザーが直接付与されたロール)、ROLE_ROLE_PRIVS(継承されたロールを取得するため)、(ロールによるシステム特権)、ROLE_SYS_PRIVSおよびROLE_TAB_PRIVS(ロールによるオブジェクト特権)を伴います。ああ。Oracleはとても複雑です。
jpmc26 2018

1

以下のコードを使用して、すべてのユーザーからすべての権限リストを取得できます。

select * from dba_sys_privs 

これには、すべての特権がリストされているわけではありません。年前にあなたの前にあっいくつかの他の回答で示されているように、テーブルの特権とロールを通じて付与されたすべての特権が省略されています。
jpmc26 2018年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.