web-dev-qa-db-ja.com

Oracleのいくつかのスキーマの特定のテーブルに選択を許可する権限をユーザーに付与する

Oracleの小さなデータウェアハウスを管理しています。ユーザーdwhmanagerにSELECT ANY TABLE権限が付与されました。

GRANT SELECT ANY TABLE TO dwhmanager WITH ADMIN OPTION;

アイデアは、データウェアハウスの開発者にいくつかのスキーマのテーブルへのアクセスを許可する機能を持つことでした。

例:

GRANT SELECT ON DWHFINANCE.SALES TO johndeveloper;

しかし、私は悪名高いORA-01031:不十分な特権

ただし、 "johndeveloper"にSELECT ANY TABLE特権を与えることもできます。これにより、彼はデータウェアハウスの任意のテーブルを選択できますが、それは多すぎるため、私の意図ではありません。

それで、他のスキーマの個々のテーブルに権限を与える権限を与えるために、メインDBAに私に付与するように依頼する必要があるのはどの権限ですか?

1

Adminオプションで許可された特定のテーブルへのselectアクセス権が必要です

GRANT SELECT ON <<table name>> 
   TO dwhManager
 WITH ADMIN OPTION;

これは、テーブルごとに実行する必要があります。あなたは動的SQLを使ってループでそれを行うことができます

BEGIN
  FOR t IN (SELECT * 
              FROM dba_tables
             WHERE owner = <<schema owner>>)
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' ||
                         t.owner || '.' || t.table_name ||
                         ' TO dwhManager WITH ADMIN OPTION';
  END LOOP;
END;

新しいテーブルを作成するたびに、新しい付与を行う必要があります。

2
Justin Cave

あなたはおそらくオブジェクト権限を付与したいでしょう

DBAとして:

GRANT GRANT ANY OBJECT PRIVILEGE TO dwhmanager;

AS dwhmanager:

grant select on DWHFINANCE.SALES TO johndeveloper;

プレスト!

2
Nick S

私にとっては、WITH ADMIN OPTIONなしで機能し、テーブルとスキーマの名前に二重引用符が付いていました

set serveroutput on format Word_wrapped;
BEGIN
  FOR t IN (SELECT * 
              FROM dba_tables
             WHERE owner = 'EIDPKI')
  LOOP  
    DBMS_OUTPUT.put_line('GRANT SELECT ON "' || t.owner || '"."' || t.table_name || '" TO OTC_READONLY');
    EXECUTE IMMEDIATE 'GRANT SELECT ON "' || t.owner || '"."' || t.table_name || '" TO YourUser';
  END LOOP;
END;
0