ALTER SYSTEM 是一个用于在数据库会话中修改 PostgreSQL 配置的实用命令。
ALTER SYSTEM 于 PostgreSQL 9.4 中添加。
注意事项
ALTER SYSTEM 只能由超级用户执行。不能授予非超级用户执行 ALTER SYSTEM 的权限;然而,从 PostgreSQL 15 开始,可以授予非超级用户修改单个 配置参数 的权限。
ALTER SYSTEM 不会检查修改后的 GUC 的有效性;与手动修改 postgresql.conf 一样,设置将在重新加载配置时进行检查。
如果使用 ALTER SYSTEM 将 配置参数 的值设置为 'DEFAULT'(例如 log_error_verbosity),则该值必须用单引号括起来,否则 ALTER SYSTEM 会将其解释为 ALTER SYSTEM SET ... TO DEFAULT,这将完全从 postgresql.auto.conf 中移除该配置参数。
无法将该命令包装在事务或 security definer 函数中。
禁用 ALTER SYSTEM
从 PostgreSQL 17 开始,可以通过 allow_alter_system 配置选项禁用 ALTER SYSTEM 命令的执行。
源代码
ALTER SYSTEM 由 src/backend/utils/misc/guc.c 中的函数 AlterSystemSetConfigFile() 处理。
变更历史
- PostgreSQL 17
- 现在可以设置不受识别的自定义 GUC(提交 2d870b4a)
- 现在可以通过 GUC
allow_alter_system禁用(提交 d3ae2a24)
- PostgreSQL 15
- PostgreSQL 9.5
- 语句现在记录为
log_statement=ddl而不是log_statement=all(提交 43bed84c)
- 语句现在记录为
- PostgreSQL 9.4
- 添加(提交 65d6e4cb)
示例
ALTER SYSTEM 的基本用法示例
postgres=# SHOW log_statement; log_statement --------------- none (1 row) postgres=# ALTER SYSTEM SET log_statement = 'all'; ALTER SYSTEM postgres=# SHOW log_statement; log_statement --------------- none (1 row) postgres=# SELECT pg_reload_conf(); pg_reload_conf ---------------- t (1 row) postgres=# SHOW log_statement; log_statement --------------- all (1 row)
(假设 postgresql.auto.conf 之前未被 ALTER SYSTEM 修改过)看起来会是这样:
postgres=# SELECT pg_read_file(setting || '/postgresql.auto.conf')
FROM pg_settings
WHERE name = 'data_directory';
pg_read_file
-------------------------------------------------------
# Do not edit this file manually! +
# It will be overwritten by the ALTER SYSTEM command.+
log_statement = 'all' +
(1 row)
将 DEFAULT 指定为配置参数的字面值,将从 postgresql.auto.conf 中将其移除
postgres=# ALTER SYSTEM SET log_statement = DEFAULT;
ALTER SYSTEM
postgres=# SELECT pg_read_file(setting || '/postgresql.auto.conf')
FROM pg_settings
WHERE name = 'data_directory';
pg_read_file
-------------------------------------------------------
# Do not edit this file manually! +
# It will be overwritten by the ALTER SYSTEM command.+
(1 row)
在下次配置重载时,将在 postgresql.conf 中其他地方为该参数指定的值(如果未设置,则为参数的默认设置)将被应用。
参考资料
- PostgreSQL documentation: ALTER SYSTEM
