9.13. Funções diversas

A Tabela 9-37 mostra diversas funções que retornam informações da sessão e do sistema.

Tabela 9-37. Funções de informação da sessão

Nome Tipo retornado Descrição
current_database() name nome do banco de dados corrente
current_schema() name nome do esquema corrente
current_schemas(boolean) name[] nomes dos esquemas no caminho de procura incluindo, opcionalmente, os esquemas implícitos
current_user name nome do usuário do contexto de execução corrente
session_user name nome do usuário da sessão
user name equivale a current_user
version() text informação da versão do PostgreSQL

A função session_user normalmente retorna o usuário que iniciou a conexão com o banco de dados corrente; imutável durante o período da conexão. A função current_user retorna o identificador do usuário utilizado na 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", enquanto o usuário corrente é o "usuário efetivo".

Nota: As funções current_user, session_user e user possuem status sintático especial no SQL: devem ser chamadas sem parênteses no final.

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

Nota: O caminho de procura pode ser alterado em tempo de execução. O comando é:

SET search_path TO esquema [, esquema, …]

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

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

Tabela 9-38. Funções de definição de configuração

Nome Tipo retornado Descrição
current_setting(nome_da_definição) text valor corrente da definição
set_config(nome_da_definição, novo_valor, é_local text define o parâmetro e retorna o novo valor

A função current_setting retorna o valor corrente da definição nome_da_definição. Corresponde ao comando SQL SHOW. Por exemplo:

=> SELECT current_setting('datestyle');

 current_setting
-----------------
 ISO, DMY
(1 linha)

A função set_config define o parâmetro nome_da_configuração como novo_valor. Se o parâmetro é_local for true, então o novo valor se aplica somente à transação corrente. Se for desejado que o novo valor seja aplicado à sessão corrente, deve ser utilizado false. Esta função corresponde ao comando SQL SET. Por exemplo:

=> SELECT set_config('log_statement_stats', 'off', false);

 set_config
------------
 off
(1 linha)

A Tabela 9-39 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 5.7 para obter mais informações sobre privilégios.

Tabela 9-39. Funções de consulta a privilégios de acesso

Nome Tipo retornado Descrição
has_table_privilege (usuário, tabela, privilégio) boolean o usuário tem privilégio para a tabela
has_table_privilege (tabela, privilégio) boolean o usuário corrente tem privilégio para a tabela
has_database_privilege (usuário, banco_de_dados, privilégio) boolean o usuário tem privilégio para o banco de dados
has_database_privilege (banco_de_dados, privilégio) boolean o usuário corrente tem privilégio para o banco de dados
has_function_privilege (usuário, função, privilégio) boolean o usuário tem privilégio para a função
has_function_privilege (função, privilégio) boolean o usuário corrente tem privilégio para a função
has_language_privilege (usuário, linguagem, privilégio) boolean o usuário tem privilégio para a linguagem
has_language_privilege (linguagem, privilégio) boolean o usuário corrente tem privilégio para a linguagem
has_schema_privilege (usuário, esquema, privilégio) boolean o usuário tem privilégio para o esquema
has_schema_privilege (esquema, privilégio) boolean o usuário corrente tem privilégio para 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 tipos de seus argumentos). Quando especificado pelo nome, este pode ser qualificado pelo esquema, se for necessário. O tipo de privilégio de acesso desejado é especificado no texto da cadeia de caracteres, que deve ser avaliado como um dos seguintes valores: SELECT, INSERT, UPDATE, DELETE, RULE, REFERENCES ou TRIGGER (Entretanto, 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 a 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 em vez de seu OID, a entrada permitida é a mesma que para o tipo de dado regprocedure. O tipo de privilégio de acesso desejado deve atualmente ser avaliado 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. O tipo de privilégio de acesso desejado 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. O tipo de privilégio de acesso desejado deve atualmente ser avaliado como CREATE ou USAGE.

Para verificar se o usuário possui a opção de concessão do privilégio, deve ser anexado WITH GRANT OPTION à palavra chave do privilégio; por exemplo, 'UPDATE WITH GRANT OPTION'.

A Tabela 9-40 mostra as funções que verificam 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 a 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 9-40. Funções de consulta à visibilidade do esquema

Nome Tipo retornado Descrição
pg_table_is_visible (oid_da_tabela) boolean a tabela está visível no caminho de procura
pg_type_is_visible (oid_de_tipo) boolean o tipo (ou domínio) está visível no caminho de procura
pg_function_is_visible (oid_de_função) boolean a função está visível no caminho de procura
pg_operator_is_visible (oid_de_operador) boolean o operador está visível no caminho de procura
pg_opclass_is_visible (oid_de_classeop) boolean a classe de operador está visível no caminho de procura
pg_conversion_is_visible (oid_de_conversão) boolean a conversão 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 em pg_class). As funções pg_type_is_visible, pg_function_is_visible, pg_operator_is_visible, pg_opclass_is_visible e pg_conversion_is_visible realizam o mesmo tipo de verificação de visibilidade para os tipos (e domínios), funções, operadores, classes de operadores e conversões, respectivamente. Para as funções e os operadores, um objeto no caminho de procura é visível 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, são considerados tanto o nome quanto o método de acesso de índice associado.

Todas estas funções requerem OIDs de objeto para identificar o objeto a ser verificado. Se for desejado verificar um objeto pelo seu nome, é conveniente utilizar os tipos aliás de OID (regclass, regtype, regprocedure ou regoperator). Exemplo:

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

Deve ser observado que não faz muito sentido testar um nome não qualificado desta maneira — se o nome puder ser reconhecido, então tem que ser visível.

A Tabela 9-41 mostra as funções que extraem informações dos catálogos do sistema. As funções pg_get_viewdef, pg_get_ruledef, pg_get_indexdef, pg_get_triggerdef e pg_get_constraintdef reconstroem, respectivamente, os comandos de criação da visão, regra, índice, gatilho e restrição; deve ser observado que esta é uma reconstrução por descompilação, e não o texto do comando original. A maioria destas funções estão presentes em duas formas, uma das quais pode, opcionalmente, gerar o resultado de forma "alinhada" (pretty-print). O formato alinhado é mais legível, mas o formato padrão tem mais probabilidade de ser interpretado da mesma maneira nas versões futuras do PostgreSQL; deve ser evitada a utilização do formato alinhado com a finalidade de geração de dumps. Passar false para o parâmetro de impressão alinhada produz o mesmo resultado da variante que não possui o parâmetro. A função pg_get_expr descompila a forma interna de uma determinada expressão, tal como o valor padrão para a coluna. Pode ser útil ao se examinar o conteúdo dos catálogos do sistema. A função pg_get_userbyid extrai o nome do usuário a partir do número de identificação do usuário.

Tabela 9-41. Funções de informação do catálogo

Nome Tipo retornado Descrição
pg_get_viewdef(nome_da_visão) text obtém o comando CREATE VIEW para a visão (em obsolescência) [a]
pg_get_viewdef(nome_da_visão, impressão_alinhada) text obtém o comando CREATE VIEW para a visão (em obsolescência)
pg_get_viewdef(oid_da_visão) text obtém o comando CREATE VIEW para a visão
pg_get_viewdef(oid_da_visão, impressão_alinhada) text obtém o comando CREATE VIEW para a visão
pg_get_ruledef(oid_da_regra) text obtém o comando CREATE RULE para a regra
pg_get_ruledef(oid_da_regra, impressão_alinhada) text obtém o comando CREATE RULE para a regra
pg_get_indexdef(oid_do_índice) text obtém o comando CREATE INDEX para o índice
pg_get_indexdef(oid_do_índice, número_da_coluna, impressão_alinhada) text obtém o comando CREATE INDEX para o índice, ou a definição de apenas uma coluna do índice quando o número_da_coluna não for zero
pg_get_triggerdef(oid_do_gatilho) text obtém o comando CREATE [ CONSTRAINT ] TRIGGER para o gatilho
pg_get_constraintdef(oid_da_restrição) text obtém a definição da restrição
pg_get_constraintdef(oid_da_restrição, impressão_alinhada) text obtém a definição da restrição
pg_get_expr(texto_da_expressão, oid_da_relação) text forma interna descompilada da expressão, assumindo que todas as Vars na mesma se referem à relação indicada pelo segundo parâmetro
pg_get_expr(texto_da_expressão, oid_da_relação, impressão_alinhada) text forma interna descompilada da expressão, assumindo que todas as Vars na mesma se referem à relação indicada pelo segundo parâmetro
pg_get_userbyid(id_do_usuário) name obtém o nome do usuário com o identificador fornecido
Notas:
a. deprecated — Dito de um programa ou funcionalidade que é considerada em obsolescência e no processo de ter sua utilização gradualmente interrompida, geralmente em favor de uma determinada substituição. As funcionalidades em obsolescência podem infelizmente, demorar muitos anos para desaparecer. The Jargon File (N. do T.)

As funções mostradas na Tabela 9-42 retornam os comentários previamente armazenados por meio do comando COMMENT. Se nenhum comentário correspondendo aos parâmetros especificados puder ser encontrado, o valor nulo é retornado.

Tabela 9-42. Funções de informação de comentário

Nome Tipo retornado Descrição
obj_description(oid_do_objeto, nome_do_catálogo) text obtém o comentário para o objeto do banco de dados
obj_description(oid_do_objeto) text obtém o comentário para o objeto do banco de dados (em obsolescência)
col_description(oid_da_tabela, número_da_coluna) text obté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 pelo nome do catálogo do sistema que o contém. Por exemplo, obj_description(123456,'pg_class') retorna o comentário para a tabela com OID 123456. A forma de obj_description() com um parâmetro requer apenas o OID do objeto. Está obsoleta, porque não existe garantia dos OIDs serem únicos entre diferentes catálogos do sistema; portanto, pode ser retornado um comentário errado.

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.

9.13.1. Diferenças entre o PostgreSQL, o Oracle, o SQL Server e o DB2

Nota: Seção escrita pelo tradutor, não fazendo parte do manual original.

Esta seção tem por finalidade mostrar, através de exemplos práticos, as diferenças entre as diversas funções mostradas acima e suas equivalentes do PostgreSQL, do Oracle e do SQL Server.

Exemplo 9-14. Funções de informação da sessão

Abaixo estão mostrados exemplos comparando a utilização das funções de informação da sessão no PostgreSQL, no SQL Server, no Oracle e no DB2. Veja também SYS_CONTEXT .

PostgreSQL 7.4.1:

=> SELECT current_database();

 current_database
------------------
 template1
(1 linha)

=> SELECT current_schema();

 current_schema
----------------
 public
(1 linha)

=> SELECT CURRENT_USER AS usuario;

 usuario
----------
 postgres
(1 linha)

=> SELECT SESSION_USER as usuario;

 usuario
----------
 postgres
(1 linha)

=> SELECT USER as usuario;

 usuario
----------
 postgres
(1 linha)

=> SELECT current_setting('client_encoding');

 current_setting
-----------------
 LATIN1
(1 linha)

=> SELECT current_setting('server_encoding');

 current_setting
-----------------
 LATIN1
(1 linha)

=> SELECT current_setting('server_version');

 current_setting
-----------------
 7.4.1
(1 linha)

=> SELECT current_setting('transaction_isolation');

 current_setting
-----------------
 read committed
(1 linha)

=> SELECT version() AS versao;

                       versao
------------------------------------------------------------
 PostgreSQL 7.4.7 on i386-redhat-linux-gnu,\
 compiled by GCC i386-redhat-linux-gcc (GCC) 3.4.2 20041017\
 (Red Hat 3.4.2-6.fc3)
(1 linha)

SQL Server 2000:

SELECT db_name() AS current_database

current_database
----------------
pubs
(1 row(s) affected)

SELECT CURRENT_USER AS usuario;

usuario
-------
dbo
(1 row(s) affected)

SELECT SESSION_USER as usuario

usuario
-------
dbo
(1 row(s) affected)

SELECT SYSTEM_USER as usuario

usuario
-------
sa
(1 row(s) affected)

SELECT @@VERSION AS versao

versao
-----------------------------------------------------------
Microsoft SQL Server  2000 - 8.00.760 (Intel X86)
        Dec 17 2002 14:22:05
        Copyright (c) 1988-2003 Microsoft Corporation
        Enterprise Edition on Windows NT 5.2 (Build 3790: )
(1 row(s) affected)

Oracle 10g:

SQL> SELECT sys_context ('USERENV', 'CURRENT_SCHEMA') FROM sys.dual;

SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
---------------------------------------
SCOTT

SQL> SELECT sys_context ('USERENV', 'CURRENT_USER') FROM sys.dual;

SYS_CONTEXT('USERENV','CURRENT_USER')
-------------------------------------
SCOTT

SQL> SELECT sys_context ('USERENV', 'DB_NAME') FROM sys.dual;

SYS_CONTEXT('USERENV','DB_NAME')
--------------------------------
orcl

SQL> SELECT sys_context ('USERENV', 'HOST') FROM sys.dual;

SYS_CONTEXT('USERENV','HOST')
-----------------------------
CASA\HALLEY

SQL> SELECT sys_context ('USERENV', 'IP_ADDRESS') FROM sys.dual;

SYS_CONTEXT('USERENV','IP_ADDRESS')
-----------------------------------
200.165.203.130

SQL> SELECT sys_context ('USERENV', 'LANGUAGE') FROM sys.dual;

SYS_CONTEXT('USERENV','LANGUAGE')
---------------------------------
AMERICAN_AMERICA.WE8ISO8859P1

SQL> SELECT sys_context ('USERENV', 'NETWORK_PROTOCOL') FROM sys.dual;

SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')
-----------------------------------------
tcp

SQL> SELECT sys_context ('USERENV', 'NLS_DATE_FORMAT') FROM sys.dual;

SYS_CONTEXT('USERENV','NLS_DATE_FORMAT')
----------------------------------------
DD-MON-RR

SQL> SELECT sys_context ('USERENV', 'OS_USER') FROM sys.dual;

SYS_CONTEXT('USERENV','OS_USER')
--------------------------------
HALLEY\Administrator

SQL> SELECT sys_context ('USERENV', 'SESSION_USER') FROM sys.dual;

SYS_CONTEXT('USERENV','SESSION_USER')
-------------------------------------
SCOTT

SQL> SELECT banner FROM v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Prod
PL/SQL Release 10.1.0.2.0 - Production
CORE    10.1.0.2.0      Production
TNS for 32-bit Windows: Version 10.1.0.2.0 - Production
NLSRTL Version 10.1.0.2.0 - Production

DB2 8.1:

DB2SQL92> SELECT CURRENT_SCHEMA FROM sysibm.sysdummy1;

1
--------
DB2INST1

DB2SQL92> SELECT CURRENT_SERVER FROM sysibm.sysdummy1;

1
------
SAMPLE

DB2SQL92> SELECT USER FROM sysibm.sysdummy1;

1
--------
DB2INST1

-- Linha de comando

$ db2level

DB21085I  A instância "db2inst1" utiliza "32" bits e o release de código do DB2
"SQL08020" com identificador de nível "03010106".
Os tokens informativos são "DB2 v8.1.0.64", "s040812", "MI00086" e FixPak "7".
O produto está instalado em "/opt/IBM/db2/V8.1".
SourceForge.net Logo