SET — modifica parâmetros de configuração de tempo de execução.
SET [ SESSION | LOCAL ]parâmetro_de_configuração{ TO | = } {valor| 'valor' | DEFAULT } SET [ SESSION | LOCAL ] TIME ZONE {valor| 'valor' | LOCAL | DEFAULT }
O comando SET modifica parâmetros de configuração
de tempo de execução.
Muitos dos parâmetros de tempo de execução listados em
Configuração do servidor podem ser modificados dinamicamente
pelo comando SET.
(Alguns parâmetros só podem ser alterados por superusuários e usuários
que receberam o privilégio SET para este parâmetro.
Também existem parâmetros que não podem ser alterados após o
servidor ou a sessão iniciar.)
O comando SET afeta apenas o valor usado pela
sessão corrente.
Se o comando SET (ou o equivalente
SET SESSION) for executado numa transação
interrompida posteriormente, os efeitos do comando SET
desaparecerão quando a transação for desfeita.
Depois que a transação envolvente for efetivada, os efeitos persistirão
até o final da sessão, a menos que sejam substituídos por outro
comando SET.
Os efeitos do comando SET LOCAL duram apenas até
o final da transação corrente, seja esta confirmada ou não.
Um caso especial é o comando SET seguido por um
comando SET LOCAL na mesma transação:
o valor do comando SET LOCAL será visto até o
final da transação, mas depois (se a transação for efetivada) o valor
do comando SET passa a valer.
Os efeitos do comando SET ou
SET LOCAL também são cancelados desfazendo
para um ponto de salvamento anterior ao comando.
Se o comando SET LOCAL for usado numa função
contendo uma opção SET para a mesma variável
(veja CREATE FUNCTION), os efeitos do comando
SET LOCAL desaparecerão ao sair da função; ou seja,
o valor em vigor quando a função foi chamada é restaurado de qualquer
maneira.
Isto permite que o comando SET LOCAL seja usado
para alterações dinâmicas ou repetidas de um parâmetro dentro de uma
função, enquanto ainda tem a conveniência de usar a opção
SET para salvar e restaurar o valor do chamador.
Entretanto, um comando SET regular substitui a
opção SET de qualquer função circundante;
seus efeitos persistirão a menos que sejam desfeitos.
Nas versões 8.0 a 8.2 do PostgreSQL,
os efeitos do comando SET LOCAL eram cancelados
ao liberar um ponto de salvamento anterior, ou ao sair com sucesso
de um bloco de exceção do PL/pgSQL.
Este comportamento foi alterado, porque foi considerado não intuitivo.
SESSION
Especifica que o comando entra em vigor na sessão corrente.
(Este é o padrão, se não aparecer nem SESSION,
nem LOCAL.)
LOCAL
Especifica que o comando tem efeito apenas para a transação corrente.
Após o COMMIT ou o ROLLBACK,
a configuração no nível de sessão entra em vigor novamente.
Executado fora de um bloco de transação emite uma advertência e,
além disso, não tem efeito.
parâmetro_de_configuraçãoNome de um parâmetro de tempo de execução configurável. Os parâmetros disponíveis estão documentados em Configuração do servidor, e abaixo.
valor
Novo valor do parâmetro.
Os valores podem ser especificados como constantes cadeias de
caracteres, identificadores, números ou listas separadas por
vírgulas, conforme apropriado para o parâmetro específico.
Pode ser escrito DEFAULT, para especificar a
redefinição do parâmetro para seu valor padrão
(isto é, o valor que teria se nenhum comando
SET tivesse sido executado na sessão corrente).
Além dos parâmetros de configuração documentados em
Configuração do servidor, existem alguns que só podem ser
ajustados usando o comando SET, ou que possuem
uma sintaxe especial:
SCHEMA
SET SCHEMA '
é uma sintaxe alternativa para
valor'SET search_path TO .
Pode ser especificado apenas um esquema ao se usar esta sintaxe.
valor
NAMES
SET NAMES '
é uma sintaxe alternativa para
valor'SET client_encoding TO .
valor
SEED
Define a semente interna para o gerador de números aleatórios
(a função random).
Os valores permitidos são números de ponto flutuante entre -1 e 1,
inclusive.
A semente também pode ser definida chamando a função
setseed:
SELECT setseed(valor);
TIME ZONE
SET TIME ZONE '
é uma sintaxe alternativa para
valor'SET timezone TO '.
A sintaxe valor'SET TIME ZONE permite uma sintaxe
especial para a especificação da zona horária.
Aqui estão exemplos de valores válidos:
'America/Los_Angeles'A zona horária para Berkeley, Califórnia.
'Europe/Rome'A zona horária para a Itália.
-7A zona horária para 7 horas a oeste de UTC (equivalente a PDT). Valores positivos são a leste de UTC.
INTERVAL '-08:00' HOUR TO MINUTEA zona horária para 8 horas a oeste de UTC (equivalente a PST).
LOCALDEFAULT
Define a zona horária para a zona horária local
(ou seja, o valor padrão do servidor para
timezone).
As configurações de zona horária fornecidas como números ou
intervalos, são traduzidas internamente para a sintaxe de zona
horária POSIX.
Por exemplo, após executar SET TIME ZONE -7,
o comando SHOW TIME ZONE mostraria
<-07>+07.
Abreviações de zona horária não têm suporte pelo comando
SET;
veja Zonas horárias para obter mais
informações sobre zona horária.
A função set_config fornece uma funcionalidade
equivalente; veja Funções de definição de configuração.
Além disso, é possível atualizar a visão do sistema
pg_settings para executar o equivalente ao
comando SET.
Definir o caminho de procura de esquema:
SET search_path TO my_schema, public;
Definir o estilo da data para o estilo tradicional do POSTGRES, com a convenção de entrada “dia antes do mês”:
SET datestyle TO postgres, dmy;
Definir a zona horária para Berkeley, Califórnia:
SET TIME ZONE 'America/Los_Angeles';
Definir a zona horária para a Itália:
SET TIME ZONE 'Europe/Rome';
Exemplo 87. Exemplo do tradutor
Zonas horárias para o Brasil e para as Américas
Embora existam algumas zonas horárias para o Brasil com o prefixo 'America', como 'America/Sao_Paulo', também existem quatro com o prefixo 'Brazil'. Este exemplo mostra estas quatro zonas horárias usando comandos do Linux e uma consulta à visão pg_timezone_names do PostgreSQL. A última consulta mostra as zonas horárias com o prefixo “America”.
$# Linux Debian 12$timedatectl list-timezones | grep Brazil
Brazil/Acre Brazil/DeNoronha Brazil/East Brazil/West
$ ls -l /usr/share/zoneinfo/Brazil/ | cut -c40-
Acre -> ../America/Rio_Branco DeNoronha -> ../America/Noronha East -> ../America/Sao_Paulo West -> ../America/Manaus
-- PostgreSQL
SELECT * FROM pg_timezone_names
WHERE name LIKE 'Brazil%'
ORDER BY abbrev;
name | abbrev | utc_offset | is_dst
------------------+--------+------------+--------
Brazil/DeNoronha | -02 | -02:00:00 | f
Brazil/East | -03 | -03:00:00 | f
Brazil/West | -04 | -04:00:00 | f
Brazil/Acre | -05 | -05:00:00 | f
(4 linhas)
SELECT * FROM pg_timezone_names
WHERE name LIKE 'America%'
ORDER BY name;
name | abbrev | utc_offset | is_dst
----------------------------------+--------+------------+--------
America/Adak | HDT | -09:00:00 | t
America/Anchorage | AKDT | -08:00:00 | t
America/Anguilla | AST | -04:00:00 | f
America/Antigua | AST | -04:00:00 | f
America/Araguaina | -03 | -03:00:00 | f
America/Argentina/Buenos_Aires | -03 | -03:00:00 | f
...
America/Winnipeg | CDT | -05:00:00 | t
America/Yakutat | AKDT | -08:00:00 | t
America/Yellowknife | MDT | -06:00:00 | t
(169 linhas)
O comando SET TIME ZONE estende a sintaxe definida
no padrão SQL.
O padrão permite apenas deslocamentos numéricos de zona horária,
enquanto o PostgreSQL permite
especificações de zona horária mais flexíveis.
Todos os outros recursos do comando SET são
extensões do PostgreSQL.