PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

SET

SET — 更改一个运行时参数

Synopsis

SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { value | 'value' | LOCAL | DEFAULT }

描述

SET 命令用于更改运行时配置参数。Chapter 19 中列出的许多运行时参数都可以用 SET 即时更改。(有些参数只能由超级用户以及被授予了该参数上的 SET 特权的用户更改。还有一些参数在服务器或会话启动之后便不能更改。)SET 只影响当前会话所使用的值。

如果 SET(或等效的 SET SESSION)是在一个后来被中止的事务中发出的,那么当该事务被回滚时,SET 命令的效果就会消失。一旦外围事务被提交,其效果将持续到会话结束,除非被另一个 SET 覆盖。

SET LOCAL 的效果只持续到当前事务结束,无论该事务是否提交。一种特殊情况是在同一个事务中先 SET 后 SET LOCAL:在事务结束之前看到的都是 SET LOCAL 的值,但在此之后(如果事务被提交),SET 的值将会生效。

回滚到比该命令更早的保存点也会取消 SET 或 SET LOCAL 的效果。

如果在某个函数内对同一变量使用了 SET LOCAL,而该函数带有针对同一变量的 SET 选项(参见 CREATE FUNCTION),那么 SET LOCAL 命令的效果会在函数退出时消失;也就是说,无论如何都会恢复该函数被调用时生效的值。这使得 SET LOCAL 可以用于在函数内动态或反复地更改参数,同时仍然保留了用 SET 选项保存并恢复调用者值的便利。不过,普通的 SET 命令会覆盖任何外围函数的 SET 选项;除非被回滚,否则其效果将持续存在。

Note

在 PostgreSQL 8.0 到 8.2 版本中,SET LOCAL 的效果会被释放更早的保存点,或者从 PL/pgSQL 异常块中成功退出所取消。由于这种行为被认为不符合直觉,它已经被更改。

参数

SESSION

指定该命令对当前会话生效。(如果既没有出现 SESSION 也没有出现 LOCAL,这就是默认值。)

LOCAL

指定该命令只对当前事务生效。在 COMMIT 或 ROLLBACK 之后,会话级的设置将重新生效。在事务块之外发出此命令会发出一个警告,除此之外没有其他效果。

configuration_parameter

一个可设置的运行时参数的名称。可用的参数在 Chapter 19 和下文中有所说明。

value

参数的新值。根据具体参数的适用情况,值可以指定为字符串常量、标识符、数字,或者以逗号分隔的上述各项的列表。可以写 DEFAULT 来指定把该参数重置为它的默认值(也就是说,如果当前会话中从未执行过 SET,它本应具有的那个值)。

除了 Chapter 19 中记述的配置参数之外,还有一些参数只能用 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 语法为时区规定允许一些特殊的写法。下面是一些有效值的例子:

'America/Los_Angeles'

加州伯克利的时区。

'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 不支持时区缩写;有关时区的更多信息,请参见 Section 8.5.3。

注记

函数 set_config 提供了等效的功能;参见 Section 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 的扩展。

另请参阅

RESET, SHOW