14

Oracle に Bob と Alice の 2 人のユーザーがいます。両方とも、sqlplus から sysdba として次のコマンドを実行して作成されます。

   $password で識別されるユーザー $blah を作成します。
   $blah へのリソースの付与、接続、ビューの作成。

Bob に Alice のスキーマ (つまり、すべてのテーブル) への完全なアクセス権を付与したいのですが、実行する権限と、sysdba として実行するか Alice として実行するかがわかりません。

参考資料への適切な指針についても聞いてうれしいです.インターネットまたは私の机に座っている「Oracle Database 10g The Complete Reference」のいずれからも、これに対する良い答えを得ることができないようです.

4

3 に答える 3

21

私の知る限り、付与オブジェクトを一度に 1 つずつ実行する必要があります。

通常、これを行うには、次のようなスクリプトを使用します。

SELECT 'GRANT ALL ON '||table_name||' TO BOB;'
FROM   ALL_TABLES
WHERE  OWNER = 'ALICE';

他の db オブジェクトについても同様です。

付与を発​​行する必要がある各スキーマにパッケージを配置することができます。そこから、EXECUTE IMMEDIATE を介して各 GRANT ステートメントを呼び出します。

例えば

   PROCEDURE GRANT_TABLES
   IS
   BEGIN

      FOR tab IN (SELECT table_name
                  FROM   all_tables
                  WHERE  owner = this_user) LOOP
         EXECUTE IMMEDIATE 'GRANT SELECT, INSERT, UPDATE, DELETE ON '||tab.table_name||' TO other_user';
      END LOOP;
   END;
于 2008-10-13T20:41:59.753 に答える
7

考慮すべきことがたくさんあります。アクセスと言うとき、テーブルの前に他のユーザー名を付けますか? 元の所有者が問題になる場合は、パブリック シノニムを使用して、元の所有者を非表示にすることができます。次に、シノニムに特権を付与します。

また、できる限り前もって計画を立てたいと考えています。後で、Frank が Alice のスキーマにもアクセスできるようにしますか? N 個のテーブルに対する権限を再付与する必要はありません。データベース ロールを使用する方が適切なソリューションです。たとえば、選択をロール「ALICE_TABLES」に付与し、別のユーザーがアクセスする必要がある場合は、そのロールに権限を付与するだけです。これは、DB 内で行った許可を整理するのに役立ちます。

于 2008-10-13T20:49:14.327 に答える
6

別の所有者がいる場合の別の解決策:

BEGIN

  FOR x IN (SELECT owner||'.'||table_name ownertab
            FROM   all_tables
            WHERE  owner IN ('A', 'B', 'C', 'D'))
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON '||x.ownertab||' TO other_user';
  END LOOP;
END;
于 2010-05-07T14:05:02.443 に答える