PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# SET

## 名称

SET -- 修改运行时参数

## 大纲

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

## 描述

`SET`命令修改运行时配置参数。许多在第 18 章 里面列出的运行时参数可以用`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`选项；其影响将会持续，除非回滚。

> 注意: 在PostgreSQL 8.0到8.2版本中，一个`SET LOCAL` 的影响将通过释放一个较早的保存点被取消，或者通过从一个PL/pgSQL 异常块成功退出。该选项已被更改，因为它被认为是非直观的。

## 参数

`SESSION`

  声明这个命令只对当前会话起作用。如果`SESSION`或`LOCAL`都没出现， 那么这个是缺省。

`LOCAL`

  声明该命令只在当前事务中有效。在`COMMIT`或者`ROLLBACK`之后， 会话级别的设置将再次生效。在事务块外面发出这个会发出一个警告否则没什么影响。

`configuration_parameter`

  可设置的运行时参数的名字。可用的参数在第 18 章和下面有文档。

`value`

  参数的新值。值可以声明为字符串常量、标识符、数字，或者逗号分隔的上面这些东西的列表， 视特定变量而定。 对于特定参数是恰当的。可以写出`DEFAULT` 把这些参数设置为它们的缺省值。（也就是说，如果在当前会话中没有`SET`执行， 已有的任何数值都会设置。）

除了在第 18 章里面有文档记载的配置参数之外， 还有几个只能用`SET`命令设置，或者是有特殊的语法的参数。

`SCHEMA`

  `SET SCHEMA '`value`'`是`SET search_path TO `value``的别名。 使用该语法只可指定一个模式。

`NAMES`

  `SET NAMES `value``是`SET client_encoding TO `value``的别名。

`SEED`

  为随机数生成器(函数`random`)设置内部的种子。 允许的值是介于 -1 和 1 之间的浮点数，然后它会被乘以 231-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`。

  参阅第 8.5.3 节获取有关时区的更多细节。

## 注意

函数`set_config`提供了等效的功能。参阅第 9.26 节。 同时，可以UPDATE这个`pg_settings` 系统视图来执行`SET`的等价操作。

## 例子

设置模式搜索路径：

    SET search_path TO my_schema, public;

把日期时间风格设置为传统的POSTGRES风格(日在月前)：

    SET datestyle TO postgres, dmy;

把时区设置为加州伯克利：

    SET TIME ZONE 'PST8PDT';

为意大利设置时区：

    SET TIME ZONE 'Europe/Rome';

## 兼容性

`SET TIME ZONE`扩展了在 SQL 标准里定义的语法。标准只允许有一个数字时区偏移， 而PostgreSQL还允许完整更灵活的时区声明。 所有其它的`SET`特性都是PostgreSQL扩展。

## 又见

RESET, SHOW

上一页 | 起始页 | 下一页
SELECT INTO | 上一级 | SET CONSTRAINTS