=== SET === .. container:: refentry :name: SQL-SET .. container:: titlepage .. container:: refnamediv .. rubric:: SET :name: set SET — 更改一个运行时参数 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT } SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT } .. container:: refsect1 :name: id-1.9.3.173.5 .. rubric:: 描述 :name: 描述 ``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:: .. rubric:: 注意 :name: 注意 :class: title 在PostgreSQL 版本 8.0 到 8.2 中, 一个\ ``SET LOCAL``\ 的效果会因为释放较早的 保存点或者成功地从一个PL/pgSQL异常块 中退出而被取消。这种行为已经被更改,因为它被认为不直观。 .. container:: refsect1 :name: id-1.9.3.173.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist ``SESSION`` 指定该命令对当前会话有效(这是默认值)。 ``LOCAL`` 指定该命令只对当前事务有效。在\ ``COMMIT``\ 或者 ``ROLLBACK``\ 之后,会话级别的设置会再次生效。 在事务块外部发出这个参数会发出一个警告并且不会有效果。 ``configuration_parameter`` 一个可设置运行时参数的名称。可用的参数被记录在 `章 `__\ 和下文中。 ``value`` 参数的新值。根据特定的参数,值可以被指定为字符串常量、标识符、 数字或者以上构成的逗号分隔列表。写\ ``DEFAULT`` 可以指定把该参数重置成它的默认值(也就是说在当前会话中还没有 执行\ ``SET``\ 命令时它具有的值)。 除了在\ `章 `__\ 中记录的配置参数, 还有一些参数只能用\ ``SET``\ 命令设置 或者具有特殊的语法: .. container:: variablelist ``SCHEMA`` ``SET SCHEMA 'value``'是 ``SET search_path TO value``\ 的一个别名。 使用这种语法只能指定一个模式。 ``NAMES`` ``SET NAMES value``\ 是 ``SET client_encoding TO value``\ 的一个别名。 ``SEED`` 为随机数生成器(函数\ ``random``\ )设置 一个内部种子。允许的值是 -1 和 1 之间的浮点数,它会被乘上 2\ :sup:`31`-1。 也可以通过调用函数\ ``setseed``\ 来设置种子: .. code:: programlisting SELECT setseed(value); ``TIME ZONE`` ``SET TIME ZONE value``\ 是 ``SET timezone TO value``\ 的一个别 名。语法\ ``SET TIME ZONE``\ 允许用于时区指定的特 殊语法。这里是合法值的例子: .. container:: variablelist ``'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``\ 。 有关时区的更多信息可见\ `节 `__\ 。 .. container:: refsect1 :name: id-1.9.3.173.7 .. rubric:: 注解 :name: 注解 函数\ ``set_config``\ 提供了等效的功能,见 `节 `__\ 。此外,可以更新 `pg_settings `__ 系统视图来执行与\ ``SET``\ 等效的工作。 .. container:: refsect1 :name: id-1.9.3.173.8 .. rubric:: 示例 :name: 示例 设置模式搜索路径: .. code:: programlisting SET search_path TO my_schema, public; 把日期风格设置为传统 POSTGRES的 “日在月之前”的输入习惯: .. code:: screen SET datestyle TO postgres, dmy; 设置时区为加州伯克利: .. code:: screen SET TIME ZONE 'PST8PDT'; 设置时区为意大利: .. code:: screen SET TIME ZONE 'Europe/Rome'; .. container:: refsect1 :name: id-1.9.3.173.9 .. rubric:: 兼容性 :name: 兼容性 ``SET TIME ZONE``\ 扩展了 SQL 标准定义的语法。标准 只允许数字的时区偏移量而 PostgreSQL允许更灵活的时区说明。 所有其他\ ``SET``\ 特性都是 PostgreSQL扩展。 .. container:: refsect1 :name: id-1.9.3.173.10 .. rubric:: 另见 :name: 另见 `RESET `__, `SHOW `__