创建 Cloud SQL for PostgreSQL 只读会话

您可以使用 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 指令,直到事务终止。

  • 只读模式可防止以下类型的语句和调用

    • 类似 VACUUMNOTIFY 的语句。
    • 具有副作用的函数。这意味着,您无法调用 FUNCTION 或执行定义为 VOLATILELANGUAGE CLANGUAGE internalPROCEDURE,因为它们的一些副作用不需要事务 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:主机网址。
  • PORT:端口号。
  • DATABASE:数据库名称。

这种方法还有一个额外的好处,那就是如果您尝试连接到不支持只读会话的旧版 Cloud SQL,则连接会失败。

您还可以拒绝特定数据库用户的所有未来连接的写入权限,如下所示:

ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';

USERNAME 替换为您要将其访问权限限制为只读的用户的用户名。

在只读会话中启用特定函数

  • 您可以启用对特定 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 函数添加标签。

后续步骤