SET
SET — изменить параметр времени выполнения
Синтаксис
SET [ SESSION | LOCAL ]параметр_конфигурации
{ TO | = } {значение
| 'значение
' | DEFAULT } SET [ SESSION | LOCAL ] TIME ZONE {часовой_пояс
| LOCAL | DEFAULT }
Описание
Команда SET
изменяет конфигурационные параметры времени выполнения. С помощью SET
можно «на лету» изменить многие из параметров, перечисленных в Главе 19. (Но для изменения некоторых могут потребоваться права суперпользователя, а другие нельзя изменять после запуска сервера или сеанса.) 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
в силу вновь вступает значение, определённое на уровне сеанса. При выполнении такой команды вне блока транзакции выдаётся предупреждение и больше ничего не происходит.параметр_конфигурации
Имя устанавливаемого параметра времени выполнения. Доступные параметры описаны в Главе 19 и ниже.
значение
Новое значение параметра. Параметры могут задаваться в виде строковых констант, идентификаторов, чисел или списков перечисленных типов через запятую, в зависимости от конкретного параметра. Указание
DEFAULT
в данном контексте позволяет сбросить параметр к значению по умолчанию (то есть, к тому значению, которое он имел бы, если в текущем сеансе не выполнялись бы командыSET
).
Помимо конфигурационных параметров, описанных в Главе 19, есть ещё несколько параметров, которые можно изменить только командой SET
или которые имеют особый синтаксис:
SCHEMA
SET SCHEMA '
— альтернативное написание командызначение
'SET search_path TO
. Такой синтаксис позволяет указать только одну схему.значение
NAMES
SET NAMES
— альтернативное написание командызначение
SET client_encoding TO
.значение
SEED
Устанавливает внутреннее начальное значение для генератора случайных чисел (функции
random
). В качестве значения допускаются числа с плавающей точкой от -1 до 1, для внутреннего применения они затем умножаются на 231-1.Это начальное значение также можно установить, вызвав функцию
setseed
:SELECT setseed(
значение
);TIME ZONE
SET TIME ZONE
— альтернативное написание командызначение
SET timezone TO
. Синтаксисзначение
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.