您可以使用
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的语句。 - 具有副作用的函数。这意味着,您无法调用
FUNCTION或执行定义为VOLATILE和LANGUAGE C或LANGUAGE internal的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:主机网址。
- PORT:端口号。
- DATABASE:数据库名称。
这种方法还有一个额外的好处,那就是如果您尝试连接到不支持只读会话的旧版 Cloud SQL,则连接会失败。
您还可以拒绝特定数据库用户的所有未来连接的写入权限,如下所示:
ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';
将 USERNAME 替换为您要将其访问权限限制为只读的用户的用户名。
在只读会话中启用特定函数
- 您可以启用对特定
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 函数添加标签。