建立 PostgreSQL 適用的 Cloud SQL 唯讀工作階段

您可以使用 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 指令。

  • 唯讀模式會禁止下列陳述式和呼叫:

    • 例如 VACUUMNOTIFY 陳述式。
    • 有副作用的函式。也就是說,您無法呼叫 FUNCTION 或執行定義為 VOLATILELANGUAGE CLANGUAGE internalPROCEDURE,因為部分副作用不需要交易 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 替換為要限制為唯讀存取權的使用者名稱。

在唯讀工作階段中啟用特定功能

  • 您可以啟用特定 FUNCTIONPROCEDURE 的使用權,這些 FUNCTIONPROCEDURE 定義為 VOLATILELANGUAGE CLANGUAGE internal。方法是將 SECURITY LABEL 附加至設為 allow 的函式或程序。
  • 如要在工作階段中禁止使用特定函式,請將 SECURITY LABEL 陳述式設為 deny
  • 如要將不影響全域狀態的函式加入許可清單,請建立預先定義的安全性標籤群組:

    CREATE EXTENSION "google_read_only_session"
    

    google_read_only_session 擴充功能可啟用下列功能:

    • 所有內建不穩定 C 函式,唯讀模式允許使用。
    • 唯讀模式允許的所有函式,這些函式來自資料庫中載入的擴充功能,包括 pl/pgsqlpl/v8 語言的處理常式函式。

    如果之後安裝了一或多個新擴充功能,請捨棄並重新建立 google_read_only_session 擴充功能,套用群組標籤:

    > DROP EXTENSION google_read_only_session;
    > CREATE EXTENSION google_read_only_session;
    

    DROP 指令不會移除任何現有標籤。第二個 CREATE 指令只會為新擴充功能中的揮發性 C 函式新增標籤。

後續步驟