SQL COMMAND · 会话与参数
SET
更改运行时参数
change a run-time parameter
SET会话与参数引入 6.4(基线)现存至 20 devel8 次语法变更
- 动词
SET- 对象
—- 分组
- 会话与参数
- 引入版本
- 6.4(基线)
- 状态
- 现存
- 语法变更次数
- 8
- 手册小节数
- 6
版本轨迹
相对 PostgreSQL 17 语法未变,正文有更新。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
SET · 语法 2
语法概要
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT } SET [ SESSION | LOCAL ] TIME ZONE { value | 'value' | LOCAL | DEFAULT }
描述
SET 命令用于更改运行时配置参数。许多在第 19 章中列出的运行时参数都可以通过
SET 即时更改。(有些参数只能由超级用户以及被授予该参数 SET 权限的用户更改。还有一些参数在服务器启动或会话开始之后便无法再更改。)SET 只影响当前会话所使用的值。
如果在一个随后被中止的事务中发出 SET(或者等效的 SET SESSION),那么在事务回滚时,SET 命令的效果就会消失。一旦该事务提交,这些效果就会持续到会话结束,除非被另一个 SET 覆盖。
SET LOCAL 的效果只持续到当前事务结束,无论事务是否提交。一种特殊情况是:在同一个事务中先执行
SET,再执行 SET LOCAL。这样 SET LOCAL 设置的值会一直生效到事务结束,但在此之后(如果该事务被提交),SET 设置的值将生效。
SET 或 SET LOCAL 的效果,也会因为回滚到早于该命令的保存点而被取消。
如果在一个针对同一变量带有 SET 选项的函数内使用
SET LOCAL(见 CREATE FUNCTION),那么 SET LOCAL 命令的效果会在函数退出时消失;也就是说,无论如何都会恢复函数被调用时生效的值。这使得 SET LOCAL
可以在函数内部用于动态或重复地更改某个参数,同时仍能方便地利用
SET 选项保存并恢复调用者的值。不过,普通的
SET 命令会覆盖任何外围函数的 SET 选项;除非回滚,否则它的效果会一直保留。
注意
在 PostgreSQL 8.0 到 8.2 版本中,SET LOCAL 的效果会因为释放一个更早的保存点,或者成功退出某个 PL/pgSQL 异常块而被取消。由于这种行为被认为不够直观,因此后来对其进行了更改。
参数
SESSION指定该命令对当前会话生效。(如果既没有出现
SESSION,也没有出现LOCAL,这就是默认情况。)LOCAL指定该命令只对当前事务生效。在
COMMIT或ROLLBACK之后,会话级设置会再次生效。在事务块外发出该命令会发出警告,但除此之外没有效果。configuration_parameter可设置的运行时参数名称。可用参数见第 19 章以及下文。
value参数的新值。根据具体参数的不同,值可以指定为字符串常量、标识符、数字,或由这些构成的逗号分隔列表。也可以写成
DEFAULT,表示把该参数重置为其默认值(即当前会话中如果从未执行过SET,它本应具有的值)。
除了在第 19 章中记录的配置参数之外,还有少数参数只能用 SET 命令调整,或者具有特殊语法:
SCHEMASET SCHEMA '是value'SET search_path TO的别名。使用这种语法时只能指定一个模式。valueNAMESSET NAMES '是value'SET client_encoding TO的别名。valueSEED设置随机数生成器(即函数
random)的内部种子。允许的值是 -1 到 1(含端点)之间的浮点数。种子也可以通过调用函数
setseed来设置:SELECT setseed(
value);TIME ZONESET TIME ZONE '是value'SET timezone TO '的别名。value'SET TIME ZONE语法允许对时区指定使用特殊语法。下面是一些有效值示例:'America/Los_Angeles'加利福尼亚州伯克利所使用的时区。
'Europe/Rome'意大利所使用的时区。
-7UTC 以西 7 小时的时区(等同于 PDT)。正值表示位于 UTC 以东。
INTERVAL '-08:00' HOUR TO MINUTEUTC 以西 8 小时的时区(等同于 PST)。
LOCALDEFAULT将时区设置为本地时区(即服务器
timezone的默认值)。
以数字或时间间隔给出的时区设置在内部会被转换为 POSIX 时区语法。例如,在
SET TIME ZONE -7之后,SHOW TIME ZONE会报告<-07>+07。SET不支持时区缩写;关于时区的更多信息,见第 8.5.3 节。
注解
函数 set_config 提供了等效功能;见第 9.28.1 节。此外,也可以对
pg_settings
系统视图执行 UPDATE,以实现与 SET 等效的操作。
示例
设置模式搜索路径:
SET search_path TO my_schema, public;
将日期风格设置为传统 POSTGRES 风格,并采用“日在月之前”的输入惯例:
SET datestyle TO postgres, dmy;
将时区设置为加利福尼亚州伯克利所使用的时区:
SET TIME ZONE 'America/Los_Angeles';
将时区设置为意大利所使用的时区:
SET TIME ZONE 'Europe/Rome';
兼容性
SET TIME ZONE 扩展了 SQL 标准定义的语法。标准只允许使用数值形式的时区偏移量,而 PostgreSQL
允许更灵活的时区指定方式。其他所有 SET 特性都是
PostgreSQL 扩展。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 19← 18语法变化
+ SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value [, ...] | DEFAULT }− SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }− SET [ SESSION | LOCAL ] TIME ZONE { value | 'value' | LOCAL | DEFAULT }正文更新PostgreSQL 18← 17正文更新
正文更新PostgreSQL 17← 16正文更新
正文更新PostgreSQL 15← 14正文更新
正文更新PostgreSQL 14← 13正文更新
正文更新PostgreSQL 13← 12正文更新
正文更新PostgreSQL 12← 11正文更新
正文更新PostgreSQL 10← 9.6语法变化
+ SET [ SESSION | LOCAL ] TIME ZONE { value | 'value' | LOCAL | DEFAULT }− SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }正文更新PostgreSQL 9.6← 9.5正文更新
正文更新PostgreSQL 9.4← 9.3正文更新
正文更新PostgreSQL 9.2← 9.1正文更新
正文更新PostgreSQL 8.4← 8.3正文更新
正文更新PostgreSQL 8.3← 8.2正文更新
正文更新PostgreSQL 8.2← 8.1语法变化
+ SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }− SET [ SESSION | LOCAL ] name { TO | = } { value | 'value' | DEFAULT }正文更新PostgreSQL 8.1← 8.0正文更新
正文更新PostgreSQL 8.0← 7.4正文更新
正文更新PostgreSQL 7.4← 7.3语法变化
+ SET [ SESSION | LOCAL ] name { TO | = } { value | 'value' | DEFAULT }− SET [ SESSION | LOCAL ] variable { TO | = } { value | 'value' | DEFAULT }正文更新PostgreSQL 7.3← 7.2语法变化
+ SET [ SESSION | LOCAL ] variable { TO | = } { value | 'value' | DEFAULT }+ SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }− SET TIME ZONE { 'timezone' | LOCAL | DEFAULT }正文更新PostgreSQL 7.2← 7.1正文更新
正文更新PostgreSQL 7.1← 7.0语法变化
sql-set.htm → sql-set.html
− SET CONSTRAINTS {ALL | constraintlist} mode− SET TIME ZONE { 'timezone' | LOCAL | DEFAULT }− SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }正文更新PostgreSQL 7.0← 6.5语法变化
+ SET variable { TO | = } { value | 'value' | DEFAULT }+ SET CONSTRAINTS {ALL | constraintlist} mode+ SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }− SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZED }正文更新PostgreSQL 6.5← 6.4语法变化
+ SET TIME ZONE { 'timezone' | LOCAL | DEFAULT }+ SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZED }− SET TIME ZONE { 'timezone' | LOCAL };正文更新