SET
SET — изменить параметр времени выполнения
Синтаксис
SET [ SESSION | LOCAL ]параметр_конфигурации{ TO | = } {значение| 'значение' | DEFAULT } SET [ SESSION | LOCAL ] TIME ZONE {значение| 'значение' | LOCAL | DEFAULT }
Описание
Команда SET изменяет конфигурационные параметры времени выполнения. С помощью 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в силу вновь вступает значение, определённое на уровне сеанса. При выполнении такой команды вне блока транзакции выдаётся предупреждение и больше ничего не происходит.параметр_конфигурацииИмя устанавливаемого параметра времени выполнения. Доступные параметры описаны в Главе 18 и ниже.
значениеНовое значение параметра. Параметры могут задаваться в виде строковых констант, идентификаторов, чисел или списков перечисленных типов через запятую, в зависимости от конкретного параметра. Указание
DEFAULTв данном контексте позволяет сбросить параметр к значению по умолчанию (то есть, к тому значению, которое он имел бы, если в текущем сеансе не выполнялись бы командыSET).
Помимо конфигурационных параметров, описанных в Главе 18, есть ещё несколько параметров, которые можно изменить только командой SET или которые имеют особый синтаксис:
SCHEMASET SCHEMA '— альтернативное написание командызначение'SET search_path TO. Такой синтаксис позволяет указать только одну схему.значениеNAMESSET NAMES— альтернативное написание командызначениеSET client_encoding TO.значениеSEEDУстанавливает внутреннее начальное значение для генератора случайных чисел (функции
random). В качестве значения допускаются числа с плавающей точкой от -1 до 1 включительно.Это начальное значение также можно установить, вызвав функцию
setseed:SELECT setseed(
значение);TIME ZONESET TIME ZONE '— альтернативное написание командызначение'SET timezone TO '. Синтаксисзначение'SET TIME ZONEпозволяет указывать часовой пояс в специальном формате. Например, допускаются следующие значения:'America/Los_Angeles'Часовой пояс Беркли, штат Калифорния.
'Europe/Rome'Часовой пояс Италии.
-7Часовой пояс, сдвинутый от UTC на 7 часов к западу (равнозначен PDT). Положительные значения означают сдвиг от UTC к востоку.
INTERVAL '-08:00' HOUR TO MINUTEЧасовой пояс, сдвинутый от UTC на 8 часов к западу (равнозначен PST).
LOCALDEFAULTУстанавливает в качестве часового пояса местный часовой пояс (то есть, значение серверного параметра
timezoneпо умолчанию).
Значения часового пояса, заданные в виде чисел или интервалов, внутри переводятся в формат часовых поясов POSIX. Например, после
SET TIME ZONE -7, командаSHOW TIME ZONEпокажет<-07>+07.Аббревиатуры часовых поясов команда
SETне поддерживает; узнать о часовых поясах подробнее можно в Подразделе 8.5.3.
Примечания
Также изменить значение параметра можно с помощью функции set_config; см. Подраздел 9.28.1. Кроме того, выполнив UPDATE в системном представлении pg_settings, можно произвести то же действие, что выполняет 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. Стандарт допускает только числовые смещения часовых поясов, тогда как Postgres Pro позволяет задавать часовой пояс более гибко. Все другие функции SET являются расширениями Postgres Pro.