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.
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".