web-dev-qa-db-ja.com

Oracleのユーザーからすべての権限を表示する方法

誰かがSQLコンソールで特定のユーザーからのすべての特権/ルールを表示する方法を教えてもらえますか?

101
destiny

あなたはこれらの下のビューを試すことができます。

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

DBAおよび他のパワーユーザーは、これらの同じビューのDBA_バージョンを使用して、他のユーザーに付与されている権限を見つけることができます。それらは ドキュメント でカバーされています。

これらのビューは、直接ユーザーに付与された特権のみを表示します。ロールを介して間接的に付与されたものも含めてall特権を見つけるには、より複雑な再帰的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;
147
Teja

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

あなたがそれを自分で書きたいのであれば、クエリはかなり挑戦的になります。 DBA_SYS_PRIVSに表示されるシステム権限をユーザーに付与することができます。 DBA_TAB_PRIVSに表示されるオブジェクト特権をそれらに与えることができます。また、DBA_ROLE_PRIVSに表示されるロールを付与することもできます(ロールはデフォルトでもデフォルトでなくてもパスワードを要求することができます。したがって、ユーザーにロールが付与されたからといって必ずしもユーザーが特権を使用できるわけではありません)彼はデフォルトでロールを介して取得しました。しかし、これらの役割には、システム特権、オブジェクト特権、およびROLE_SYS_PRIVSROLE_TAB_PRIVS、およびROLE_ROLE_PRIVSを見ることで表示できる追加の役割が与えられます。 Peteの脚本はそれらの関係を歩き回り、最終的にユーザーに流れるすべての特権を示しています。

18
Justin Cave

もう一つの役に立つリソース:

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

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
7
Ageu

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

select * from dba_sys_privs 
1
Ravi Bhushan

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句を変更するだけです。
  • これは単一のクエリです。つまり、精神的に一緒に結果を作成する必要はありません。
  • それは彼らが特権を与えることができるかどうか、そしてそれが特権の異なる源にまたがってサブオブジェクト(「階層的」部分)のための特権を含むかどうかという問題を解決する。
  • 特権の取り消しに必要なすべての情報が一覧表示されているので、簡単に確認できます。
  • それはテーブルとシステム特権を単一の首尾一貫したビューに結合します、それで私たちがリストにすることを可能にしますall一気にユーザーの特権を落下しました。
  • これはqueryで、これをすべてDBMS_OUTPUTなどで表す関数ではありません(Pete Finniganのリンクされたスクリプトと比較して)。これにより、プログラムでの使用やエクスポートに役立ちます。
  • フィルタは繰り返されません。一度だけ現れます。これにより変更が容易になります。
  • 個々のGRANTごとに調べる必要がある場合は、副照会を簡単に取り出すことができます。
0
jpmc26

すべての特権を表示する

system_privilege_mapから名前を選択してください。

0