cloudsql_session_read_only セッション パラメータを使用して、読み取り専用の Cloud SQL for PostgreSQL セッションを作成できます。このアプローチは、標準の PostgreSQL 読み取り専用オプションよりも、セッション中のデータ変更を防ぐための堅牢な方法です。cloudsql_session_read_only パラメータを使用すると、セッションを一時的に読み取り専用にしたり、セッションの期間中ずっと読み取り専用にしたりできます。このような読み取り専用セッションを使用すると、Model Context Protocol(MCP)ツール、レポートツール、監査ツールを使用しているセッションなど、さまざまなコンテキストでデータ整合性を保護できます。
デフォルトでは、cloudsql_session_read_only は off に設定されており、データの変更が許可されています。
読み取り専用モードで防ぐことができること
読み取り専用セッションでは、データベースはデータを変更できません。具体的には、読み取り専用モードでは次の操作が禁止されます。
読み取り専用モードでは、新しいトランザクション ID の生成が防止されます。書き込み可能なトランザクションを開始できないため、データ操作言語(DML)またはデータ定義言語(DDL)の命令を実行できません。ただし、アクティブな書き込み可能トランザクションの途中でフラグが設定された場合、トランザクションが終了するまで基本的な DML と DDL の命令を実行できます。
読み取り専用モードでは、次の種類のステートメントと呼び出しは禁止されます。
VACUUMやNOTIFYなどのステートメント。- 副作用のある関数。つまり、
VOLATILEとLANGUAGE CまたはLANGUAGE internalの両方として定義されているFUNCTIONを呼び出したり、PROCEDUREを実行したりすることはできません。これは、一部の副作用でトランザクション ID が必要ないためです。例:pg_promote()、pg_cancel_backend()、pg_terminate_backend() - 外部データラッパー。
- SQL 手続き型言語(PL)で作成した関数またはプロシージャ。
読み取り専用ステータスを構成する
Cloud SQL for PostgreSQL セッション中に、SET ステートメントを使用して、cloudsql_session_read_only フラグの値を次のように変更できます。
SET cloudsql_session_read_only = 'on'このステートメントにより、セッションが読み取り専用になり、フラグが
onに設定されている限り、誰もデータを変更できなくなります。セッションの後半でデータの変更を再開するには、値をoffに戻します。SET cloudsql_session_read_only = 'off'フラグを
offに戻すと、フラグがlockedに設定されている場合を除き、セッションの書き込みアクセス権が復元されます。SET cloudsql_session_read_only = 'locked'フラグを
lockedに設定すると、セッションは永続的に読み取り専用になります。フラグをlockedに設定すると、セッションの期間中はフラグを他の値に変更できません。
データベースに接続するとすぐにセッションを永続的に読み取り専用にするには、セッションの接続文字列に cloudsql_session_read_only フラグを埋め込みます。
postgresql://USER:PASSWORD@HOST:PORT/DATABASE?options=-ccloudsql_session_read_only=locked
次のように置き換えます。
- USER: セッションを作成するユーザーのユーザー名。
- PASSWORD: ユーザーのパスワード。
- HOST: ホスト URL。
- PORT: ポート番号。
- DATABASE: データベース名。
このアプローチには、読み取り専用セッションをサポートしていない古いバージョンの Cloud SQL に接続しようとすると、接続が失敗するという利点もあります。
次のように、特定のデータベース ユーザーに対する書き込みアクセス権を今後のすべての接続で拒否することもできます。
ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';
USERNAME は、読み取り専用に制限するユーザーのユーザー名に置き換えます。
読み取り専用セッションで特定の関数を有効にする
VOLATILEとLANGUAGE Cの両方、またはLANGUAGE internalとして定義された特定のFUNCTIONまたはPROCEDUREの使用を有効にできます。これを行うには、allowに設定されている関数またはプロシージャにSECURITY LABELを付加します。- セッションで特定の関数を禁止するには、
SECURITY LABELステートメントをdenyに設定します。 グローバル状態に影響しない関数を許可リストに登録するには、セキュリティ ラベルの事前定義グループを作成します。
CREATE EXTENSION "google_read_only_session"google_read_only_session拡張機能では、次のことが可能になります。- 読み取り専用モードで許可されているすべての組み込み揮発性 C 関数。
pl/pgsql言語とpl/v8言語のハンドラ関数など、データベースに読み込まれた拡張機能の読み取り専用モードで許可されているすべての関数。
後で 1 つ以上の新しい拡張機能をインストールする場合は、グループラベルを適用するために、
google_read_only_session拡張機能を削除して再作成します。> DROP EXTENSION google_read_only_session; > CREATE EXTENSION google_read_only_session;DROPコマンドは、既存のラベルを削除しません。2 番目のCREATEコマンドは、新しい拡張機能の揮発性 C 関数のラベルを追加するだけです。
次のステップ
- Cloud SQL for PostgreSQL フラグについて学習する。
- Cloud SQL for PostgreSQL 拡張機能の詳細を確認する。