web-dev-qa-db-ja.com

既存のOracleスキーマへの読み取り専用アクセスの許可

アプリケーションが選択、挿入、更新に使用するOracle 11gスキーマがありますが、アプリケーションが所有する同じベーステーブルとビューへの読み取り専用アクセスを提供するように、ある顧客からリクエストがありました。

アプリケーションが所有するすべてのテーブルをシノニムにして新しいアカウントにする(またはシノニムを公開する)以外に、どうすればこれを実行できますか?

私が注目すべきアプローチやOracle機能へのヘルプやポインタが最もありがたいです、ありがとう!

3
Andrew

読み取り専用アクセスを許可するには、別のアカウントが必要です。読み取り専用アクセス権を付与する役割も追加することをお勧めします。将来、より多くのユーザーがこのアクセス権を必要とする場合は、その役割を再利用できます。

CREATE ROLE my_read_only_role;

BEGIN
  FOR x IN (SELECT table_name FROM dba_tables WHERE owner=<<schema name>>)
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO my_read_only_role';
  END LOOP;
  FOR y IN (SELECT view_name FROM dba_views WHERE owner=<<schema name>>)
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' || y.view_name || ' TO my_read_only_role';
  END LOOP;
END;
/

GRANT my_read_only_role TO new_customer_account;

それが完了すると、新しいアカウントはテーブル名の前にスキーマ名を付けてデータを選択する必要があります。または、オブジェクトごとにパブリックシノニムを作成することもできます(上記のコードの各ループに別のEXECUTE IMMEDIATEを追加できます)。または、ユーザーにコマンドを実行させることができます

ALTER SESSION SET current_schema = <<schema name>>

ログイン時。これを自動的に実行するログイントリガーを新しいアカウントに作成することもできます。それは<<schema name>>は、スキーマプレフィックスとして暗黙的に追加されます。セッションの権限には影響しません。ユーザーには引き続き読み取り専用権限があり、デフォルトのスキーマ名が変更されています。

8
Justin Cave

Sysdbaとして、クォータなしでnew_customer_accountを作成しました。

create user new_customer_account
  IDENTIFIED BY new_password
  DEFAULT TABLESPACE USERS
  TEMPORARY TABLESPACE TMP
  PROFILE DEFAULT
  ACCOUNT UNLOCK;
GRANT CONNECT TO new_customer_account;
GRANT CREATE SESSION TO new_customer_account;
ALTER USER new_customer_account QUOTA 0 ON users;

Application_userは、関連するビュー(またはテーブル、あるいはその両方)に対する選択権を付与しました。

BEGIN
 FOR i IN (SELECT *
             FROM all_views
            WHERE owner = ''
              AND relevant_where_clause) LOOP
  EXECUTE IMMEDIATE 'GRANT SELECT ON application_user.'
          || i.view_name || ' TO new_customer_account';
 END LOOP;
END;

その後、new_customer_accountが新しい類義語を作成します。

BEGIN
 FOR i IN (SELECT *
             FROM all_views
            WHERE owner = 'application_user'
              AND relevant_where_clause) LOOP
  EXECUTE IMMEDIATE 'CREATE SYNONYM ' || i.view_name
          || ' FOR application_user.' || i.view_name;
 END LOOP;
END;
2
maletin

新しいアカウントを作成し、そのユーザーにのみselectを付与する必要があると確信しています。

1
chris