9.19. Funções de informação do sistema

A Tabela 9-41 mostra várias funções para extrair informações da sessão e do sistema.

Tabela 9-41. 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
inet_client_addr() inet endereço da conexão remota
inet_client_port() int4 porta da conexão remota
inet_server_addr() inet endereço da conexão local
inet_server_port() int4 port da conexão local
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; mas os superusuários podem mudar esta definição através de SET SESSION AUTHORIZATION. 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 inet_client_addr retorna o endereço de IP do cliente corrente, e a função inet_client_port retorna o número da porta. A função inet_server_addr retorna o endereço de IP do servidor de destino da conexão corrente, e a função inet_server_port retorna o número da porta. Todas estas funções retornam NULL se a conexão corrente for através de um soquete do domínio Unix.

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

A Tabela 9-42 mostra as funções que permitem o usuário consultar os privilégios de acesso dos objetos através de programa. Consulte a Seção 5.7 para obter informações adicionais sobre privilégios.

Tabela 9-42. 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 possui o privilégio para a tabela
has_table_privilege (tabela, privilégio) boolean o usuário corrente possui o privilégio para a tabela
has_database_privilege (usuário, banco_de_dados, privilégio) boolean o usuário possui o privilégio para o banco de dados
has_database_privilege (banco_de_dados, privilégio) boolean o usuário corrente possui o privilégio para o banco de dados
has_function_privilege (usuário, função, privilégio) boolean o usuário possui o privilégio para a função
has_function_privilege (função, privilégio) boolean o usuário corrente possui o privilégio para a função
has_language_privilege (usuário, linguagem, privilégio) boolean o usuário possui o privilégio para a linguagem
has_language_privilege (linguagem, privilégio) boolean o usuário corrente possui o privilégio para a linguagem
has_schema_privilege (usuário, esquema, privilégio) boolean o usuário possui o privilégio para o esquema
has_schema_privilege (esquema, privilégio) boolean o usuário corrente possui o privilégio para o esquema
has_tablespace_privilege (usuário, espaço_de_tabelas, privilégio) boolean o usuário possui o privilégio para o espaço de tabelas
has_tablespace_privilege (espaço_de_tabelas, privilégio) boolean o usuário corrente possui o privilégio para o espaço de tabelas

A função has_table_privilege verifica se o usuário pode acessar a tabela de uma determinada maneira. O usuário pode ser especificado pelo nome ou pelo ID (pg_user.usesysid) ou, se o argumento for omitido, é assumido current_user. A tabela pode ser especificada pelo nome ou pelo OID. Portanto, na verdade existem seis variações de has_table_privilege, que podem ser distinguidas pelo número e tipo de seus argumentos. Quando se especifica pelo nome, o nome pode ser qualificado pelo esquema se for necessário. O tipo de privilégio de acesso desejado é especificado através de texto em uma cadeia de caracteres, que deve resultar em um dos seguintes valores: SELECT, INSERT, UPDATE, DELETE, RULE, REFERENCES ou TRIGGER (não faz diferença maiúscula ou minúsculas). 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 maneira. As possibilidades para os argumentos são análogas às da função has_table_privilege. O tipo de privilégio de acesso desejado deve resultar em 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 maneira. As possibilidades para os argumentos são análogas às da função has_table_privilege. Ao se especificar a função através de um texto em uma cadeia de caracteres em vez de pelo OID, a entrada permitida é a mesma que para o tipo de dado regprocedure (consulte a Seção 8.12). O tipo de privilégio de acesso desejado deve resultar em EXECUTE. Exemplo:

SELECT has_function_privilege('joel', 'minha_função(int, text)', 'execute');

A função has_language_privilege verifica se o usuário pode acessar a linguagem procedural de uma determinada maneira. As possibilidades para os seus argumentos são análogas às da função has_table_privilege. O tipo de privilégio de acesso desejado deve resultar em USAGE.

A função has_schema_privilege verifica se o usuário pode acessar o esquema de uma determinada maneira. As possibilidades para os seus argumentos são análogas às da função has_table_privilege. O tipo de privilégio de acesso desejado deve resultar em CREATE or USAGE.

A função has_tablespace_privilege verifica se o usuário pode acessar o espaço de tabelas de uma determinada maneira. As possibilidades para os seus argumentos são análogas às da função has_table_privilege. O tipo de privilégio de acesso desejado deve resultar em CREATE.

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

A Tabela 9-43 mostra as funções que determinam se um certo objeto é visível através do 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 seu nome sem uma qualificação de esquema explícita. 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-43. Funções de consulta à visibilidade do esquema

Nome Tipo retornado Descrição
pg_table_is_visible (oid_da_tabela) boolean a tabela é visível no caminho de procura
pg_type_is_visible (oid_do_tipo) boolean o tipo (ou domínio) é visível no caminho de procura
pg_function_is_visible (oid_da_função) boolean a função é visível no caminho de procura
pg_operator_is_visible (oid_do_operador) boolean o operador é visível no caminho de procura
pg_opclass_is_visible (oid_da_classe_de_operadores) boolean a classe de operadores é visível no caminho de procura
pg_conversion_is_visible (oid_da_conversão) boolean a conversão é 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-44 mostra as funções que extraem informações dos catálogos do sistema.

Tabela 9-44. Funções de informações dos catálogos do sistema

Nome Tipo retornado Descrição
format_type(oid_do_tipo, typemod) text obtém o nome SQL do tipo de dado
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
pg_get_serial_sequence(nome_da_tabela, nome_da_coluna) text obtém o nome da seqüência utilizada pela coluna serial ou bigserial
pg_tablespace_databases(oid_do_espaço_de_tabelas) setof oid obtém o conjunto de OIDs de banco de dados que possuem objetos no espaço de tabelas
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.)

A função format_type retorna o nome SQL do tipo de dado que é identificado pelo seu OID de tipo e, possivelmente, um modificador de tipo. Deve ser passado NULL para o modificador de tipo se não for conhecido nenhum modificador específico.

As funções pg_get_viewdef, pg_get_ruledef, pg_get_indexdef, pg_get_triggerdef e pg_get_constraintdef reconstroem, respectivamente, o comando 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 original do comando. A função pg_get_expr descompila a forma interna de uma expressão individual, tal como o valor padrão para uma coluna. Pode ser útil ao examinar o conteúdo dos catálogos do sistema. 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_userbyid extrai o nome do usuário a partir do número de identificação do usuário. A função pg_get_serial_sequence busca o nome da seqüência associada à coluna serial ou bigserial. O nome está adequadamente formatado para ser passado para as funções de seqüência (consulte a Seção 9.12). Retorna NULL se a coluna são possuir uma seqüência associada.

A função pg_tablespace_databases permite examinar a utilização de um espaço de tabelas. Retorna um conjunto de OIDs de bancos de dados que possuem objetos armazenados no espaço de tabelas. Se esta função retornar alguma linha, então o espaço de tabelas não está vazio e, portanto, não pode ser removido. Para mostrar os objetos presentes no espaço de tabelas, é necessário se conectar ao banco de dados identificado por pg_tablespace_databases e consultar seus catálogos pg_class.

As funções mostradas na Tabela 9-45 extraem os comentários previamente armazenados pelo comando COMMENT. Retorna o valor nulo se não puder ser encontrado um comentário corespondendo aos parâmetros especificados.

Tabela 9-45. 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, column_number) 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.19.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 funções de informação do sistema mostradas acima e suas equivalentes do PostgreSQL, do Oracle, do SQL Server e do DB2.

Exemplo 9-19. Funções de informação do sistema

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

PostgreSQL 8.0.0:

=> SELECT current_database();

 current_database
------------------
 template1

=> SELECT current_schema();

 current_schema
----------------
 public

=> SELECT current_schemas(TRUE);

   current_schemas
---------------------
 {pg_catalog,public}

=> SELECT CURRENT_USER AS usuario;

 usuario
----------
 postgres

=> SELECT inet_client_addr();

 inet_client_addr
------------------
 192.168.75.1

=> template1=# SELECT inet_client_port();

 inet_client_port
------------------
            16522

=> SELECT inet_server_addr();

 inet_server_addr
------------------
 192.168.75.128

=> SELECT inet_server_port();

 inet_server_port
------------------
             5432

=> SELECT SESSION_USER as usuario;

 usuario
----------
 postgres

=> SELECT USER as usuario;

 usuario
----------
 postgres

=> SELECT version() AS versao;

                                         versao
-----------------------------------------------------------------------------------------
 PostgreSQL 8.0.0 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)

SQL Server 2000:

SELECT db_name() AS current_database

current_database
----------------
pubs

SELECT CURRENT_USER AS usuario;

usuario
-------
dbo

SELECT SESSION_USER as usuario

usuario
-------
dbo

SELECT SYSTEM_USER as usuario

usuario
---------------------
CMRJ_BD\Administrator

SELECT host_name() AS maquina_cliente

maquina_cliente
---------------
CMRJ_BD


SELECT @@SERVERNAME AS maquina_servidora

maquina_servidora
-----------------
CMRJ_BD

SELECT @@SERVICENAME AS nome_servico

nome_servico
--------------------------------------------------------------------------------------------------------------------------------
MSSQLSERVER

SELECT @@LANGUAGE AS idioma

idioma
------------------
Português (Brasil)

SELECT @@VERSION AS versao

versao
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server  2000 - 8.00.2039 (Intel X86)
    May  3 2005 23:18:38
    Copyright (c) 1988-2003 Microsoft Corporation
    Personal Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

Oracle 10g:

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

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

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', 'HOST') FROM sys.dual;

SYS_CONTEXT('USERENV','HOST')
-----------------------------
halleypo

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')
------------------------------------
BRAZILIAN PORTUGUESE_BRAZIL.AL32UTF8

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/MM/RR

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

SYS_CONTEXT('USERENV','OS_USER')
--------------------------------
oracle

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 Express Edition Release 10.2.0.1.0 - Production
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

DB2 9.1:

db2 => VALUES(CURRENT_SERVER);

1
------
SAMPLE

db2 => VALUES(CURRENT_SCHEMA);

1
--------
DB2INST1

db2 => VALUES(CURRENT_PATH);

1
--------------------------------------------------
"SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","DB2INST1"

db2 => VALUES(SYSTEM_USER);

1
--------
DB2INST1

db2 => VALUES(SESSION_USER);

1
--------
DB2INST1

db2 => VALUES(CURRENT_USER);

1
--------
DB2INST1

db2 => VALUES(USER);

1
--------
DB2INST1

-- Linha de comando

$ db2level

DB21085I  Instance "db2inst1" uses "64" bits and DB2 code release "SQL09010"
with level identifier "02010107".
Informational tokens are "DB2 v9.1.0.0", "s060629", "LINUXAMD64", and Fix Pack "0".
Product is installed at "/opt/ibm/db2/V9.1".
SourceForge.net Logo CSS válido!