SET

Name

SET -- 改变运行时参数

Synopsis

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

输入

SESSION

声明这条命令为当前会话起作用。(如果既未声明 SESSION 也未声明 LOCAL, 那么这个是缺省。)

LOCAL

声明这条命令只在当前事务中起作用。在 COMMIT 或者 ROLLBACK 之后,会话级别的设置再次生效。请注意,如果在 BEGIN 块之外执行, 那么 SET LOCAL 将不起作用,因为事务将立即结束。

variable

可设置的全局变量.

value

参数的新值。DEFAULT 可以用于声明把参数恢复为缺省值.允许使用字串数组, 但是更复杂的结构需要用单引号或者双引号引起来.

描述

SET 命令修改运行时配置参数。许多在管理员手册 里面列出的运行时参数可以用 SET 在运行时设置。 (但是有些要求使用超级用户权限来修改,而其它有些则在服务器或者会话开始之后不能修改。) 请注意 SET 只影响当前会话使用的数值。

如果 SET 或者 SET SESSION 是在一个稍后退出的事务里发出的, 那么 SET 命令的效果将在事务回滚的之后消失。 (这个行为和PostgreSQL版本 7.3之前的不同, 那个时候 SET 的效果在后面的错误之后不会回滚。) 一旦包围它的事务提交,那么其效果将持续到事务的结束,除非被另外一个 SET 覆盖。

SET LOCAL 的效果只持续到当前事务结束,不管是否提交。 一个特例是在一个事务里面的 SET 后面跟着一个 SET LOCAL:在事务结束之前只能看到 SET LOCAL 的数值,但是之后(如果事务提交),则是 SET 的值生效。

即使 autocommit 设置为 offSET 也不开始一个新的事务块。参阅 管理员手册 里面的 autocommit 小节获取细节。

下面是一些几个可以设置的参数的附加细节:

DATESTYLE

设置日期/时间表示风格。有两个独立的配置需要设置: 缺省的日期/时间输出和语意含糊的输入的解释.

下面是日期/时间输出风格:

ISO

使用 ISO 8601-风格的日期和时间(YYYY-MM-DD HH:MM:SS)这是缺省设置.

SQL

使用 Oracle/Ingres-风格的日期和时间.请注意这个风格和 SQL 没有任何关系(SQL要求使用ISO 8601风格), 这个命名选项是历史原因.

PostgreSQL

使用传统 PostgreSQL格式

German

使用 dd.mm.yyyy 作为数字日期表达式.

下面的两个选项决定 "SQL""PostgreSQL" 两个选项的输出格式的子风格,以及优先的含糊日期输入的解释.

European

使用 dd/mm/yyyy 作为数字化的日期表现形式.

NonEuropean
US

使用 mm/dd/yyyy 作为数字日期表现形式.

SET DATESTYLE 的值可以是来自第一列中的一个(输出风格), 或者是来自第二列中的一个(子风格), 或者来自上面两个列表,并且用逗号分隔两个参数.

SET DATESTYLE 影响输入并且提供好几种标注输入格式。 对于需要使用输入或者输出的不同变体或者更紧地控制输入输出地应用, 考虑使用 to_char 族函数。

除了常用的 SET 或者配置文件条目之外,还有几种现在已经废弃地设置日期时间的方法:

设置 postmaster 的PGDATESTYLE 环境变量。(这个方法将被其它的方法覆盖。)
使用选项 -o -e 运行 postmaster,把日期设置成 European 习惯。 (这个覆盖环境变量和配置文件条目。)
设置客户端的 PGDATESTYLE 环境变量。 如果在一个前端的环境里用 libpq 设置了 PGDATESTYLE, 那么 libpq 在连接启动的时候将自动把 DATESTYLE 值设置成 PGDATESTYLE。 这个等效于手工发出 SET DATESTYLE

NAMES

SET NAMESSET CLIENT_ENCODING 的别名。

SEED

为随机数生成器设置内部种子.

value

random范围函数使用的种子的值。 典型的值是介于0 和 1之间的浮点数, 这个数随后乘以 231-1.如果使用了超出范围的数值, 生成的积自动溢出。

种子还可以通过调用 setseed SQL 函数设置:

SELECT setseed(value);
	    

SERVER_ENCODING

显示服务器端多字节编码。(目前,这个参数只能显示,不能设置, 因为编码是在 initdb 的时候决定的。)

TIME ZONE
TIMEZONE

为你的会话设置缺省时区.参数可以是一个 SQL 时间间隔常量, 一个整数或者双精度常量,或者一个代表宿主操作系统支持的时区字串.

下面是一些时区的有效值:

'PST8PDT'

把时区值设为加州,伯克利。

'Portugal'

把时区值设为葡萄牙。

'Europe/Rome'

把时区值设为意大利

7

把时区设置为 GMP 以西 7 小时(等效于 PDT)。

INTERVAL '08:00' HOUR TO MINUTE

把时区设置为 GMP 以西 8 小时(等效于 PST).

LOCAL
DEFAULT

把时区值设为你的本地时区(你的操作系统确省的那个).

用于时区的可能值取决于你的操作系统.例如,在Linux上 /usr/share/zoneinfo 包含时区的数据库; 该目录下的文件名可以用做此命令的参数。

如果声明了一个非法的时区,时区就设为GMT(在大多数系统上如此).

如果一个基于 libpq 的客户端程序在前端环境里设置了PGTZlibpq 将在联接启动时自动把 TIMEZONE 设置成为PGTZ的值。

使用 SHOW 来显示当前的参数设置.

诊断

SET

成功的返回信息.

ERROR: 'name is not a valid option name

你试图设置的参数不存在。

ERROR: 'name': permission denied

为了访问一些设置,你必须是超级用户.

ERROR: name can only be set at start

有些参数在服务器启动后就无法更改了.

例子

把日期时间风格设置为传统的 PostgreSQL风格,同时还有Europen(欧洲)风格:

SET DATESTYLE TO PostgreSQL,European;

把时区设置为 Berkeley, California, 使用双引号保存时区声明里大写字符的属性 (注意这里的日期/时间格式是 PostgreSQL):

 
SET TIME ZONE 'PST8PDT';
SELECT CURRENT_TIMESTAMP AS today;
               today
------------------------------------
 Tue Feb 26 07:32:21.42834 2002 PST

设置时区为 Italy(注意这里要求的单或者双引号来操作特殊的字符):

 
SET TIME ZONE 'Europe/Rome';
SELECT CURRENT_TIMESTAMP AS today;
   
             today
-------------------------------
 2002-10-08 05:39:35.008271+02

兼容性

SQL92

SET TIME ZONE 扩展了在 SQL9x 里定义的语法。 SQL9x 允许只有一个数字时区偏移, 而 PostgreSQL 还允许完整的时区描述符字串。 所有其它的 SET 特性都是 PostgreSQL 扩展.

又见

PostgreSQL User's Guide. 函数 set_config 提供了等效的功能。 参阅 PostgreSQL 用户手册 里的 杂项函数