Administrando Sinônimos (SYNONYM)

Um SYNONYM “sinônimo” é um apelido para um objeto do esquema. Por exemplo, você pode criar um sinônimo para um tabela ou view, sequence, programa PL/SQL, user-defined object type, ou até mesmo de outro synonym.

Como um sinônimo é simplesmente um apelido, ele não requer armazenamento além de sua definição no dicionário de dados. Os sinônimos podem simplificar as instruções SQL para usuários do banco de dados. Os sinônimos também são úteis para ocultar a identidade e o local de um objeto de esquema subjacente.

Se o objeto subjacente precisar ser renomeado ou movido, somente o sinônimo deverá ser redefinido. Os aplicativos baseados no sinônimo continuam funcionando sem modificações. Você pode criar sinônimos privados e públicos.

Um sinônimo privado está no esquema de um usuário específico que tem controle sobre sua disponibilidade para outros. Um sinônimo público pertence ao grupo de usuários chamado PUBLIC e é acessível a todos os usuários do banco de dados.

Um sinônimo público é um SYNONYM pertencente à conta de usuário PUBLIC, que é uma conta de usuário criada automaticamente e mantida pelo banco de dados Oracle. O usuário PUBLIC não se destina a ser uma conta na qual você faz login para obter acesso. Em vez disso, PUBLIC é um mecanismo pelo qual você pode criar objetos de propriedade global. Especificamente, qualquer coisa pertencente a PUBLIC pertence automaticamente a todos os usuários no banco de dados. O mesmo vale para sinônimos públicos. Observe que, para criar objetos PUBLIC SYNONYM, uma conta de usuário deve ter o privilégio do sistema CREATE PUBLIC SYNONYM.

Public Synonym – Sinônimos públicos

Suponha que um administrador de banco de dados crie um sinônimo público chamado people para a tabela hr.employees. O usuário então se conecta ao esquema oe e conta o número de linhas na tabela referenciada pelo sinônimo.

SQL> CREATE PUBLIC SYNONYM people FOR hr.employees;
 
Synonym created.
 
SQL> CONNECT oe
Enter password: password
Connected.

SQL> SELECT COUNT(*) FROM people;

  COUNT(*)
----------
       107
SQL> SELECT OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME 
  2  FROM DBA_SYNONYMS 
  3  WHERE SYNONYM_NAME = 'PEOPLE';
 
OWNER      SYNONYM_NAME TABLE_OWNER TABLE_NAME
---------- ------------ ----------- ----------
PUBLIC     PEOPLE       HR          EMPLOYEES

Ao conceder privilégios de objeto em um sinônimo, você realmente está concedendo privilégios no objeto subjacente. O sinônimo está atuando apenas como um alias para o objeto na instrução GRANT.

Criando Sinônimos

Crie um sinônimo usando a instrução CREATE SYNONYM. Para criar um sinônimo privado em seu próprio esquema, você deve ter o privilégio CREATE SYNONYM. Para criar um sinônimo privado no esquema de outro usuário, você deve ter o privilégio CREATE ANY SYNONYM. Para criar um sinônimo público, você deve ter o privilégio do sistema CREATE PUBLIC SYNONYM.

Quando você cria um sinônimo, o objeto do esquema subjacente não precisa existir nem privilégios para acessar o objeto para que a instrução CREATE SYNONYM seja bem-sucedida. A instrução a seguir cria um sinônimo público chamado public_emp na tabela emp contida no esquema de jward:

CREATE PUBLIC SYNONYM public_emp FOR jward.emp

Usando Sinônimos em instruções DML.

Um sinônimo pode ser referenciado em uma instrução DML da mesma maneira que o objeto subjacente do sinônimo pode ser referenciado. Você pode usar com êxito qualquer sinônimo privado contido em seu esquema ou qualquer sinônimo público, assumindo que você tenha os privilégios necessários para acessar o objeto subjacente, explicitamente, a partir de uma função ativada ou a partir de PUBLIC. Você também pode fazer referência a qualquer sinônimo privado contido em outro esquema se tiver recebido os privilégios de objeto necessários para o objeto subjacente.

Você pode utilizar sinônimos nas seguintes instruções DML: SELECT, INSERT, UPDATE, DELETE, FLASHBACK TABLE, EXPLAIN PLAN e LOCK TABLE.
Você pode utilizar sinônimos nas seguintes instruções DDL: AUDIT, NOAUDIT, GRANT, REVOKE e COMMENT.

Você pode fazer referência ao sinônimo de outro usuário usando apenas os privilégios de objeto que você recebeu. Por exemplo, se você tiver apenas o privilégio SELECT na tabela jward.emp e o sinônimo jward.employee for criado para jward.emp, poderá consultar o sinônimo jward.employee, mas não poderá inserir linhas usando o sinônimo jward.employee.

Por exemplo, se um sinônimo chamado employee se referir a uma tabela ou view, a seguinte declaração é válida:

INSERT INTO employee (empno, ename, job)
VALUES (emp_sequence.NEXTVAL, 'SMITH', 'CLERK');

Deletando Sinônimos

Exclua um sinônimo que não é mais necessário usando a instrução DROP SYNONYM. Para eliminar um sinônimo privado, omita a palavra-chave PUBLIC. Para eliminar um sinônimo público, inclua a palavra-chave PUBLIC. Você pode eliminar qualquer sinônimo privado em seu próprio esquema. Para eliminar um sinônimo privado no esquema de outro usuário, você deve ter o privilégio do sistema DROP ANY SYNONYM. Para eliminar um sinônimo público, você deve ter o privilégio do sistema DROP PUBLIC SYNONYM. Por exemplo, a seguinte instrução descarta o sinônimo privado chamado emp:

DROP SYNONYM emp;

A instrução a seguir elimina o sinônimo público chamado public_emp:

DROP PUBLIC SYNONYM public_emp;

Quando você exclui um sinônimo, sua definição é removida do dicionário de dados. Todos os objetos que fazem referência a um sinônimo eliminado permanecem. No entanto, eles se tornam inválidos (não utilizáveis).

Dicionário de dados de sinônimos

Você pode consultar visões do dicionário de dados para obter informações sobre os SYNONYM:

VIEWDescrição
DBA_SYNONYMS
ALL_SYNONYMS
USER_SYNONYMS
Essas visões descrevem SYNONYMS.
Sinônimos privados estão em USER_SYNONYM
Sinônimos públicos estão em ALL_SYNONYM e DBA_SYNONYM.

Observe que sinônimos públicos não estão listados na visualização USER_SYNONYMS, que mostra apenas sinônimos privados. Mesmo se você estiver conectado a uma conta de usuário que criou um objeto de sinônimo público específico, ainda não o encontrará listado na visualização USER_SYNONYMS. Em vez disso, você o encontrará em ALL_SYNONYMS e DBA_SYNONYMS.

USER_SYNONYM: Apenas sinônimos privados, ou seja, usou o comando CREATE SYNONYM.

ALL_SYNONYM / DBA_SYNONYM: se encontram os sinônimos públicos, ou seja, usou o seguinte comando de criação: CREATE PUBLIC SYNONYM.

Resolução de sinônimos do banco de dados Oracle: exemplo

O banco de dados Oracle tenta resolver referências a objetos no nível do esquema antes de resolvê-los no nível de sinônimo PUBLIC, ou seja, primeiro ele procura um objeto no sinônimo privado PRIVATE SYNONYM, para depois procurar um objeto no sinônimo público PUBLIC SYNONYM.

Por exemplo, os esquemas oe e sh contêm tabelas denominadas customers. No próximo exemplo, o usuário SYSTEM cria um sinônimo PUBLIC chamado customers para oe.customers:

CREATE PUBLIC SYNONYM customers FOR oe.customers;

Se o usuário sh emitir a seguinte instrução, o banco de dados retornará a contagem de linhas de sh.customers:

SELECT COUNT(*) FROM customers;

Para recuperar a contagem de linhas de oe.customers, o usuário deve preceder os clientes com o nome do esquema. (O usuário também deve ter permissão de seleção em oe.customers.)

SELECT COUNT(*) FROM oe.customers;

Se o esquema do usuário hr não contiver um objeto chamado customers e se hr tiver permissão de seleção em oe.customers, o hr poderá acessar a tabela customers no esquema do oe usando os sinônimos públicos:

SELECT COUNT(*) FROM customers;

Namespace

O que acontece se você tentar criar um objeto de banco de dados com um nome que corresponda ao nome de outro objeto de banco de dados que já esteja no banco de dados? Consegues fazê-lo? O que acontece com o objeto de banco de dados existente? Você poderá usar o objeto de banco de dados resultante? A resposta é que depende da relação do seu objeto com o outro objeto que já existe, bem como de algo chamado de namespace.

Um namespace é um limite lógico dentro do banco de dados que abrange um conjunto específico de objetos de banco de dados. Existem vários namespaces em um banco de dados. É necessário entender o namespace para entender se você pode ou não especificar nomes duplicados para objetos específicos de banco de dados. Veja a Figura 1 abaixo que demonstra os limites dos namespaces. Observe que cada quadrado inclui um namespace diferente:

Figura 1 – Namespaces

O que podemos observar é que PUBLIC SYNONYMS e PRIVATE SYNONYMS estão em namespaces diferentes, isso significa que é possível dar o mesmo nome para um objeto PUBLIC SYNONYM e para o objeto PRIVATE SYNONYM. Não podemos dar o mesmo nome por exemplo pra uma tabela e uma view pois estão no mesmo namespace.

Temos duas separações importantes em um banco de dados, objetos esquemas SCHEMA, e objetos não-esquemáticos NONSCHEMA. Os objetos não-esquemáticos são user, role e public synonym, os objetos esquema são: table, view, sequence, private synonym, index, and constraint.

Resumindo, os sinônimos são nomes alternativos para objetos já existentes no banco de dados.

Referências

Overview of Synonyms
Create Synonym