6.13. Funções diversas

A Tabela 6-27 mostra diversas funções que obtêm informações da sessão e do sistema.

Tabela 6-27. Funções de informação da sessão

NomeTipo retornadoDescrição
current_database()namenome do banco de dados corrente
current_schema()namenome do esquema corrente
current_schemas(boolean)name[]nomes dos esquemas no caminho de procura incluindo, opcionalmente, os esquemas implícitos
current_usernamenome do usuário do contexto de execução corrente
session_usernamenome do usuário da sessão
usernameequivale ao current_user
version()textinformação da versão do PostgreSQL

O session_user é o usuário que estabeleceu a conexão com o banco de dados; imutável durante a conexão. O current_user é o identificador do usuário utilizado para verificação de permissão. Normalmente é igual ao usuário da sessão, mas muda durante a execução das funções com o atributo SECURITY DEFINER. Na terminologia Unix, o usuário da sessão é o "usuário real" e o usuário corrente é o "usuário efetivo".

Nota: O current_user, o session_user e o user possuem status sintático especial no SQL: devem ser chamados sem parênteses.

O current_schema retorna o nome do esquema que está em primeiro lugar no caminho de procura (ou o valor nulo se o caminho de procura estiver vazio). Este é o esquema utilizado para qualquer tabela ou outro objeto nomeado que for criado sem especificar o esquema a ser utilizado. O current_schemas(boolean) retorna uma matriz com os nomes de todos os esquemas presentes no caminho de procura. A opção booleana determina se os esquemas incluídos implicitamente sistema, tal como pg_catalog, serão incluídos no caminho de procura retornado.

O caminho de procura pode ser alterado por uma configuração em tempo de execução. O comando a ser utilizado é o SET SEARCH_PATH 'esquema'[,'esquema']...

A função version() retorna uma cadeia de caracteres descrevendo a versão do servidor PostgreSQL.

A Tabela 6-28 mostra as funções disponíveis para consultar e modificar os parâmetros de configuração em tempo de execução.

Tabela 6-28. Funções de informação dos valores de configuração

NomeTipo retornadoDescrição
current_setting(nome_da_configuração) textvalor atual da configuração
set_config(nome_da_configuração, novo_valor, is_local) textnovo valor da configuração

A função current_setting é utilizada para obter o valor corrente da configuração nome_da_configuração como o resultado de uma consulta. Equivale ao comando SQL SHOW. Por exemplo:

select current_setting('DateStyle');
            current_setting
---------------------------------------
 ISO with US (NonEuropean) conventions
(1 row)

A função set_config permite que a configuração nome_da_configuração seja alterada para o novo_valor. Se is_local for definido como true, o novo valor somente se aplica à transação corrente. Se for desejado que o novo valor seja aplicado para a sessão corrente, deve ser utilizado false. Equivale ao comando SQL SET. Por exemplo:

select set_config('show_statement_stats','off','f');
 set_config
------------
 off
(1 row)

A Tabela 6-29 lista as funções que permitem o usuário consultar os privilégios de acesso aos objetos por meio de programa. Veja a Seção 2.7 para obter mais informações relativas aos privilégios.

Tabela 6-29. Funções de consulta a privilégios de acesso

NomeTipo retornadoVerifica se
has_table_privilege(usuário, tabela, acesso) booleano usuário pode acessar a tabela
has_table_privilege(tabela, acesso) booleano usuário corrente pode acessar a tabela
has_database_privilege(usuário, banco_de_dados, acesso) booleano usuário pode acessar o banco de dados
has_database_privilege(banco_de_dados, acesso) booleano usuário corrente pode acessar o banco de dados
has_function_privilege(usuário, função, acesso) booleano usuário pode acessar a função
has_function_privilege(função, acesso) booleano usuário corrente pode acessar a função
has_language_privilege(usuário, linguagem, acesso) booleano usuário pode acessar a linguagem
has_language_privilege(linguagem, acesso) booleano usuário corrente pode acessar a linguagem
has_schema_privilege(usuário, esquema, acesso) booleano usuário pode acessar o esquema
has_schema_privilege(esquema, acesso) booleano usuário corrente pode acessar o esquema

A função has_table_privilege verifica se o usuário pode acessar a tabela de uma determinada forma. O usuário pode ser especificado pelo nome ou pelo ID (pg_user.usesysid) ou, se o argumento for omitido, será utilizado o current_user. A tabela pode ser especificada pelo nome ou pelo OID (Portanto, existem na verdade seis variantes de has_table_privilege, as quais podem ser distinguidas pelo número e pelos tipos de seus argumentos). Quando especificado pelo nome, este pode ser qualificado pelo esquema, se for necessário. A forma de acesso desejada é especificada no texto da cadeia de caracteres, que deve ser avaliado como um dos seguintes valores: SELECT, INSERT, UPDATE, DELETE, RULE, REFERENCES ou TRIGGER (Maiúsculas e minúsculas não fazem diferença). Um exemplo é:

SELECT has_table_privilege('meu_esquema.minha_tabela', 'select');

A função has_database_privilege verifica se o usuário pode acessar o banco de dados de uma determinada forma. As possibilidades para seus argumentos são análogas às da função has_table_privilege. Os tipos de acesso desejados devem ser avaliados como CREATE, TEMPORARY ou TEMP (que equivale ao TEMPORARY).

A função has_function_privilege verifica se o usuário pode acessar a função de uma determinada forma. As possibilidades para seus argumentos são análogas às da função has_table_privilege. Ao especificar a função por meio de um texto e não pelo seu OID, a entrada permitida é a mesma que para o tipo de dado regprocedure. A forma de acesso desejada deve atualmente ser avaliada como EXECUTE.

A função has_language_privilege verifica se o usuário pode acessar a linguagem procedural de um determinado modo. As possibilidades para seus argumentos são análogas às da função has_table_privilege. A forma de acesso desejada deve atualmente ser avaliado como USAGE.

A função has_schema_privilege verifica se o usuário pode acessar o esquema de uma determinada forma. As possibilidades para seus argumentos são análogas às da função has_table_privilege. A forma de acesso desejada deve atualmente ser avaliado como CREATE ou USAGE.

A Tabela 6-30 mostra as funções que informam se um determinado objeto está visível no caminho de procura de esquema corrente. Uma tabela é dita visível se o esquema que a contém está no caminho de procura, e nenhuma tabela com o mesmo nome aparece antes no caminho de procura. Equivale declarar que a tabela pode ser referenciada pelo nome sem uma qualificação explícita do esquema. Por exemplo, para listar o nome de todas as tabelas visíveis:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

Tabela 6-30. Funções de consulta à visibilidade do esquema

NomeTipo retornadoVerifica se
pg_table_is_visible(OID_tabela) booleana tabela está visível no caminho de procura
pg_type_is_visible(OID_tipo) booleano tipo está visível no caminho de procura
pg_function_is_visible(OID_função) booleana função está visível no caminho de procura
pg_operator_is_visible(OID_operador) booleano operador está visível no caminho de procura
pg_opclass_is_visible(oOID_classeop) booleana classe de operador está visível no caminho de procura

A função pg_table_is_visible realiza a verificação para as tabelas (ou visões, ou qualquer outro tipo de entrada na pg_class). As funções pg_type_is_visible, pg_function_is_visible, pg_operator_is_visible e pg_opclass_is_visible realizam o mesmo tipo de verificação de visibilidade para os tipos, funções, operadores e classes de operadores, respectivamente. Para as funções e operadores, um objeto está visível no caminho de procura se não existir nenhum objeto com o mesmo nome e mesmos tipos de dado dos argumentos aparecendo antes no caminho. Para as classes de operadores, tanto o nome quanto o método de acesso do índice associado são considerados.

Todas estas funções requerem os OIDs dos objetos para identificar o objeto a ser verificado. Se for desejado testar o objeto pelo nome é conveniente utilizar os tipos aliases de OID (regclass, regtype, regprocedure ou regoperator), por exemplo

SELECT pg_type_is_visible('meu_esquema.widget'::regtype);

Observe que não faz muito sentido testar um nome não qualificado deste modo --- se o nome puder ser reconhecido então tem que ser visível.

A Tabela 6-31 lista as funções que extraem informações dos catálogos do sistema. As funções pg_get_viewdef(), pg_get_ruledef(), pg_get_indexdef() e pg_get_constraintdef() reconstroem, respectivamente, os comandos de criação da visão, da regra, do índice e da restrição. (Observe que esta é uma reconstrução por descompilação, e não o texto exato do comando). Atualmente a função pg_get_constraintdef() somente funciona para as restrições de chave estrangeira. A função pg_get_userbyid() obtém o nome do usuário a partir do valor do usesysid.

Tabela 6-31. Funções de informação do catálogo

NomeTipo retornadoDescrição
pg_get_viewdef(nome_da_visão)textObtém o comando CREATE VIEW para a visão (obsoleto)
pg_get_viewdef(OID_visão)textObtém o comando CREATE VIEW para a visão
pg_get_ruledef(OID_regra)textObtém o comando CREATE RULE para a regra
pg_get_indexdef(OID_índice)textObtém o comando CREATE INDEX para o índice
pg_get_constraintdef(OID_restrição)textObtém a definição da restrição
pg_get_userbyid(ID_usuario)nameObtém o nome do usuário com o ID_usuário fornecido

As funções mostradas na Tabela 6-32 obtêm os comentários previamente armazenados por meio do comando COMMENT. Se nenhum comentário correspondendo aos parâmetros especificados puder ser encontrando, o valor nulo é retornado.

Tabela 6-32. Funções de informação de comentário

NomeTipo retornadoDescrição
obj_description(OID_objeto, nome_da_tabela)textObtém o comentário para o objeto do banco de dados
obj_description(OID_objeto)textObtém o comentário para o objeto do banco de dados (obsoleto)
col_description(OID_tabela, número_da_coluna)textObtém o comentário para a coluna da tabela

A forma da função obj_description() com dois parâmetros retorna o comentário para o objeto do banco de dados especificado pelo seu OID, e o nome do catálogo do sistema que o contém. Por exemplo, obj_description(123456,'pg_class') obtém o comentário para a tabela com OID 123456. A forma de obj_description() com um parâmetro requer apenas o o OID do objeto. Está obsoleta porque não existe garantia dos OIDs serem únicos entre diferentes catálogos do sistema; portanto, um comentário errado pode ser retornado.

A função col_description() retorna o comentário para a coluna da tabela especificada pelo OID da tabela e pelo número da coluna. A função obj_description() não pode ser utilizada para colunas de tabela porque as colunas não possuem OIDs próprios.