SET
SET — 更改运行时参数
概要
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { value | 'value' | LOCAL | DEFAULT }
说明
SET
命令更改运行时配置参数。第 20 章中列出的许多运行时参数都可以使用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
选项;除非回滚,否则其效果将持续存在。
注意
在PostgreSQL8.0 到 8.2 版本中,SET LOCAL
的效果将因释放较早的保存点或成功退出PL/pgSQL异常块而被取消。此行为已被更改,因为它被认为不直观。
参数
SESSION
指定该命令对当前会话生效。(如果既不出现
SESSION
也不出现LOCAL
,则这是默认值。)LOCAL
指定该命令仅对当前事务生效。在
COMMIT
或ROLLBACK
之后,会话级设置将再次生效。在事务块外部发出此命令会发出警告,否则不会产生任何效果。configuration_parameter
可设置运行时参数的名称。可用的参数在 第 20 章 和以下内容中记录。
value
参数的新值。值可以指定为字符串常量、标识符、数字或这些值的逗号分隔列表,具体取决于特定参数。可以编写
DEFAULT
来指定将参数重置为其默认值(即,如果在当前会话中没有执行SET
,它将具有的任何值)。
除了第 20 章中记录的配置参数之外,还有一些参数只能使用SET
命令进行调整,或者具有特殊语法
SCHEMA
SET SCHEMA '
是value
'SET search_path TO
的别名。只能使用此语法指定一个架构。value
NAMES
SET NAMES
是value
SET client_encoding TO
的别名。value
SEED
设置随机数生成器的内部种子(函数
random
)。允许的值是 -1 到 1(包括)之间的浮点数。还可以通过调用函数
setseed
来设置种子SELECT setseed(
value
);TIME ZONE
SET TIME ZONE '
是value
'SET timezone TO '
的别名。语法value
'SET TIME ZONE
允许对时区规范使用特殊语法。以下是有效值示例'PST8PDT'
加州伯克利的时区。
'Europe/Rome'
意大利的时区。
-7
比 UTC 西 7 小时的时区(相当于 PDT)。UTC 以东为正值。
INTERVAL '-08:00' HOUR TO MINUTE
比 UTC 西 8 小时的时区(相当于 PST)。
LOCAL
DEFAULT
将时区设置为您的本地时区(即
timezone
的服务器默认值)。
以数字或间隔给出的时区设置在内部转换为 POSIX 时区语法。例如,在
SET TIME ZONE -7
之后,SHOW TIME ZONE
将报告<-07>+07
。SET
不支持时区缩写;有关时区的更多信息,请参阅 第 8.5.3 节。
注释
函数set_config
提供了同等的功能;请参阅第 9.27.1 节。此外,还可以 UPDATEpg_settings
系统视图来执行等效于SET
的操作。
示例
设置模式搜索路径
SET search_path TO my_schema, public;
使用“day before month”输入约定将日期样式设置为传统的POSTGRES
SET datestyle TO postgres, dmy;
设置伯克利加州的时区
SET TIME ZONE 'PST8PDT';
设置意大利的时区
SET TIME ZONE 'Europe/Rome';
兼容性
SET TIME ZONE
扩展了 SQL 标准中定义的语法。该标准只允许数字时区偏移,而PostgreSQL允许更灵活的时区规范。所有其他SET
功能都是PostgreSQL扩展。