SET

SET — modifica parâmetros de configuração de tempo de execução.

Sinopse

SET [ SESSION | LOCAL ] parâmetro_de_configuração { TO | = }
    { valor
    | 'valor'
    | DEFAULT
    }
SET [ SESSION | LOCAL ] TIME ZONE
    { valor
    | 'valor'
    | LOCAL
    | DEFAULT
    }

Descrição

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.

Nota

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.

Parâmetros

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ção

Nome 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 'valor' é uma sintaxe alternativa para SET search_path TO valor. Pode ser especificado apenas um esquema ao se usar esta sintaxe.

NAMES

SET NAMES 'valor' é uma sintaxe alternativa para 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 'valor' é uma sintaxe alternativa para SET timezone TO 'valor'. A sintaxe 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.

-7

A 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 MINUTE

A zona horária para 8 horas a oeste de UTC (equivalente a PST).

LOCAL
DEFAULT

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.

Notas

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.

Exemplos

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)

Conformidade

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.

Veja também

RESET, SHOW, pg_settings