Oracle – Sinônimos públicos (public synonyms). Quando devo usar?

Fala PessoALL,

Depois de muito tempo sem escrever, vamos nós de novo!

Tenho me deparado sempre com dúvidas de desenvolvedores quanto ao uso de sinônimos públicos. Devemos usar? Não devemos? Cria pra todos os objetos? Não cria? Vamos tentar de uma vez por todas desvendar esse mistério de public synonym no Oracle.

Bom, sinônimos, como bem sabemos são palavras que tem o mesmo significado… isso no português! No Oracle, sinônimo é um pouco diferente, porém sendo um pouco igual! Confuso não? Rs. Vamos simplificar!

No Oracle o sinônimo público (public synonym) é um objeto de banco, cujo dono é PUBLIC (ou seja, todo mundo) que “aponta” para um outro objeto de um determinado schema. Como se fosse uma espécie de link. Por exemplo:

Imagine que você tem uma tabela no schema DONOSIS chamada MINHATABELA. Caso algum usuário que não seja DONOSIS deseje executar um select nesta tabela, você faz o seguinte comando: select * from donosis.minhatabela, mas e se eu não quiser colocar o dono do objeto na frente? Seja para que meus usuários não saibam quem é o dono dos objetos (questões de segurança), seja para que eu simplifique a codificação? Aí eu uso o sinônimo público! Eu crio um sinônimo púbico chamado MINHATABELA que aponta para o objeto de banco: DONOSIS.MINHATABELA. O código para criação é:

create or replace public synonym MINHATABELA for DONOSIS.MINHATABELA;

Após a criação deste sinônimo público, qualquer usuário do banco que executar o select select * from MINHATABELA; conseguirá de forma transparente acessar a tabela MINHATABELA do schema DONOSIS sem nem saber que ela se encontra neste schema! Simples não?

Isso pode ser utilizado para qualquer objeto de banco, como: Views, Procedures, Functions, Packages, Tables, etc.

Claro que para que o acesso ao objeto seja concluído, o usuário que está acessando tem que possuir privilégio no objeto de destino. Ou seja, mesmo com sinônimo público, os privilégios que foram concedidos no objeto de destino continuam funcionando normalmente.

Vantagens?
Simplicidade de codificação (não precisa colocar o nome do dono do objeto na frente).
Transparência de propriedade (não se sabe quem é o dono do objeto).
Simples modificação de objetos (você pode mudar o dono dos objetos, sem impacto algum).

Quando não usar?
Quando o objeto só será utilizado pelo próprio dono. Por exemplo: Se nossa tabela MINHATABELA fosse utilizada apenas por objetos do schema DONOSIS, não tinhamos a menor necessidade de ter um sinônimo, o objeto sendo do próprio schema, não precisamos colocar o schema na frente!

Erros mais comuns:
ORA-01775 loop chain of synonyms – Este erro ocorre geralmente quando ocorre algum problema com o objeto destino que o sinônimo aponta, por exemplo: Se for uma procedure que está inválida; Se for uma tabela que não existe; algo do tipo!

É isso pessoal, espero que tenha ficado claro como funciona e para que serve os sinônimos públicos (public synonym). Por enquanto é só!

Qualquer coisa, basta entrar em contato.

Atc.
Gerson Júnior
gerson.vasconcelos@gmail.com

2 ideias sobre “Oracle – Sinônimos públicos (public synonyms). Quando devo usar?

  1. Clayton

    Boa tarde.

    Muito legal seu post.

    Aproveitando gostaria de pedir seu apoio para resolver uma situação que estamos passando.

    No projeto que estou trabalhando estamos tendo problemas com sinonimos. Os mesmos ficam invalidos mesmo quando os objetos aos quais eles se referenciam estão compilados e integros.

    Para detalhar melhor o problema vou explicar o cenário:

    Temos um owner (OWNERPROC) que possui algumas packages com procedures e funções.

    E outro owner (OWNERACESSO) que possui sinonimos referenciados as packages do owner OWNERPROC.

    Sempre realizamos alguma manutenção ou modificação nas packages do owner OWNERPROC os sinonimos do owner OWNERACESSO ficam invalidas. Ressalto que os sinonimos ficam invalidos mesmo quando o estado das packages no owner OWNERPROC estejam validos.

    A solução adotada até então é recriar os sinonimos.

    Alguém saberia dizer se existe algo que possa ser feito para solucionar esse problema?

    Estamos utilizando Oracle Database 10g Enterprise Edition Release 10.2.0.4.0.

    Antes utilizavamos Oracle 9 e não tinhamos esse problema.

    Um grande abraço a todos.

    Clayton.

    Responder
    1. oracle Autor do post

      Clayton,

      Primeiro, valeu pela visita ao http://www.diaadiaoracle.com.br… volte sempre.

      Só vai dar erro se o objeto estiver inválido na hora que o synonym tentar acessar.
      Quando voce muda o objeto, dá um compile nele, de fato ele invalida o synonym, mas ao tentar usar, ele funciona normalmente e re-valida o synonym.

      Dá uma olhada no exemplo abaixo: Tenho uma package em DBAGABOS chamada GABOSMONITOR e to acessando ela no usuário TESTE_SYM através de um synonym.


      C:UsersGersonJr>sqlplus dbagabos@orcl

      SQL*Plus: Release 10.2.0.3.0 - Production on Qui Mar 24 16:49:45 2011

      Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

      Informe a senha:

      Conectado a:
      Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
      With the Partitioning, OLAP and Data Mining options

      SQL> create user teste_sym identified by teste;

      Usußrio criado.

      SQL> grant connect,resource to teste_sym;

      ConcessÒo bem-sucedida.

      SQL> select object_name,object_type from dba_objects where object_name='GABOSMONITOR';

      OBJECT_NAME OBJECT_TYPE
      ----------- -------------------
      GABOSMONITOR PACKAGE
      GABOSMONITOR PACKAGE BODY

      SQL> grant create synonym to teste_sym;

      ConcessÒo bem-sucedida.

      SQL> grant execute on gabosmonitor to teste_sym;

      ConcessÒo bem-sucedida.

      SQL> conn teste_sym@orcl
      Informe a senha:
      Conectado.
      SQL> create synonym gabosmonitor for dbagabos.gabosmonitor;

      Sin¶nimo criado.

      SQL> select object_name,status from user_objects where object_name='GABOSMONITOR';

      OBJECT_NAME OBJECT_TYPE STATUS
      ----------------- ----------- -------
      GABOSMONITOR SYNONYM VALID

      SQL> conn dbagabos@orcl
      Informe a senha:
      Conectado.
      SQL> alter package gabosmonitor compile;

      Pacote alterado.

      SQL> conn teste_sym@orcl
      Informe a senha:
      Informe a senha:
      Conectado.
      SQL> select object_name,object_type,status from user_objects where object_name='GABOSMONITOR';

      SQL> select object_name,status from user_objects where object_name='GABOSMONITOR';

      OBJECT_NAME OBJECT_TYPE STATUS
      ----------------- ----------- -------
      GABOSMONITOR SYNONYM INVALID

      SQL> begin
      2 gabosmonitor.monitora_tablespaces;
      3 end;
      4 /

      Procedimento PL/SQL concluÝdo com sucesso.

      SQL> select object_name,status from user_objects where object_name='GABOSMONITOR';

      OBJECT_NAME OBJECT_TYPE STATUS
      ----------------- ----------- -------
      GABOSMONITOR SYNONYM VALID

      Abraço!!

      Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *