アプリケーションが選択、挿入、更新に使用するOracle 11gスキーマがありますが、アプリケーションが所有する同じベーステーブルとビューへの読み取り専用アクセスを提供するように、ある顧客からリクエストがありました。
アプリケーションが所有するすべてのテーブルをシノニムにして新しいアカウントにする(またはシノニムを公開する)以外に、どうすればこれを実行できますか?
私が注目すべきアプローチやOracle機能へのヘルプやポインタが最もありがたいです、ありがとう!
読み取り専用アクセスを許可するには、別のアカウントが必要です。読み取り専用アクセス権を付与する役割も追加することをお勧めします。将来、より多くのユーザーがこのアクセス権を必要とする場合は、その役割を再利用できます。
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>>
は、スキーマプレフィックスとして暗黙的に追加されます。セッションの権限には影響しません。ユーザーには引き続き読み取り専用権限があり、デフォルトのスキーマ名が変更されています。
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;
新しいアカウントを作成し、そのユーザーにのみselectを付与する必要があると確信しています。