您可以使用 cloudsql_session_read_only 工作階段參數,建立 PostgreSQL 適用的 Cloud SQL 唯讀工作階段。相較於標準 PostgreSQL 唯讀選項,這種方法更能防止在工作階段期間修改資料。使用 cloudsql_session_read_only 參數,您可以暫時或在工作階段期間永久將工作階段設為唯讀。您可以在各種情境中使用這類唯讀工作階段,包括使用 Model Context Protocol (MCP) 工具、報表工具和稽核工具的工作階段,協助保護資料完整性。
根據預設,cloudsql_session_read_only 會設為 off,允許修改資料。
唯讀模式禁止執行的操作
在唯讀工作階段中,資料庫無法修改任何資料。具體來說,唯讀模式會禁止下列操作:
唯讀模式會禁止產生新的交易 ID。 無法啟動任何可寫入的交易,因此無法執行任何資料操縱語言 (DML) 或資料定義語言 (DDL) 指令。不過,如果是在可寫入的有效交易中設定標記,則在交易終止前,仍可執行基本 DML 和 DDL 指令。
唯讀模式會禁止下列陳述式和呼叫:
- 例如
VACUUM和NOTIFY陳述式。 - 有副作用的函式。也就是說,您無法呼叫
FUNCTION或執行定義為VOLATILE和LANGUAGE C或LANGUAGE internal的PROCEDURE,因為部分副作用不需要交易 ID。例如pg_promote()、pg_cancel_backend()和pg_terminate_backend()。 - 外部資料包裝函式。
- 您以 SQL 程序語言 (PL) 建立的任何函式或程序。
- 例如
設定唯讀狀態
在 PostgreSQL 適用的 Cloud SQL 工作階段中,您可以使用 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:主機網址。
- PORT:通訊埠編號。
- DATABASE:資料庫名稱。
如果您嘗試連線至不支援唯讀工作階段的舊版 Cloud SQL,連線就會失敗,這是這個方法的額外優點。
您也可以拒絕特定資料庫使用者日後的所有連線寫入存取權,如下所示:
ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';
將 USERNAME 替換為要限制為唯讀存取權的使用者名稱。
在唯讀工作階段中啟用特定功能
- 您可以啟用特定
FUNCTION或PROCEDURE的使用權,這些FUNCTION或PROCEDURE定義為VOLATILE和LANGUAGE C或LANGUAGE internal。方法是將SECURITY LABEL附加至設為allow的函式或程序。 - 如要在工作階段中禁止使用特定函式,請將
SECURITY LABEL陳述式設為deny。 如要將不影響全域狀態的函式加入許可清單,請建立預先定義的安全性標籤群組:
CREATE EXTENSION "google_read_only_session"google_read_only_session擴充功能可啟用下列功能:- 所有內建不穩定 C 函式,唯讀模式允許使用。
- 唯讀模式允許的所有函式,這些函式來自資料庫中載入的擴充功能,包括
pl/pgsql和pl/v8語言的處理常式函式。
如果之後安裝了一或多個新擴充功能,請捨棄並重新建立
google_read_only_session擴充功能,套用群組標籤:> DROP EXTENSION google_read_only_session; > CREATE EXTENSION google_read_only_session;DROP指令不會移除任何現有標籤。第二個CREATE指令只會為新擴充功能中的揮發性 C 函式新增標籤。
後續步驟
- 進一步瞭解 PostgreSQL 適用的 Cloud SQL 標記。
- 進一步瞭解 PostgreSQL 適用的 Cloud SQL 擴充功能。