Cloud SQL for PostgreSQL
セッションを
cloudsql_session_read_only セッション パラメータを使用して、読み取り専用のセッションを作成できます。この方法は、標準の 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/pgsqlpl/v8言語のハンドラ関数など。
後で 1 つ以上の新しい拡張機能をインストールする場合は、グループ ラベルを適用するために、
google_read_only_session拡張機能を削除して再作成します。> DROP EXTENSION google_read_only_session; > CREATE EXTENSION google_read_only_session;DROPコマンドでは、既存のラベルは削除されません。2 番目のCREATEコマンドは、新しい拡張機能の揮発性 C 関数のラベルを追加するだけです。