Para aqueles que tem um pouco de dificuldade e compreender a utilização de sinonimos.
Muitos que acompanham o oraclehome vão me dizer que ja temos um post sobre sinônimos, escrito pelo Rafael Stoever, mas neste post vou mostrar na pratica.
Para ver o post do Rafael sobre sinônimos clique aqui
Vamos tentar simplificar suas visões com este breve artigo.
Primeiramente, O que são sinonimos?
Sinonimos são objetos do banco de dados que fazem relação a outros objetos. Podemos considerar um sinonimo como um link para outro objeto.
Digamos que no owner “prod” vc tenha a tabela “produto”, e você precisa efetuar um select nesta tabela com o owner teste.
Alem do grant que você terá de efetuar você deverá efetuar o select passando o owner antes do nome da tabela, assim.
select * from prod.produto;
Se você criar um sinonimo para esta tabela você não precisa referenciala ao owner.
select * from produto;
Observem.
SQL> conn prod/prod
Connected.
SQL> create table produto (nome varchar2(10));
Table created.
SQL> insert into produto values('Lana');
1 row created.
SQL> insert into produto values('ORACLEHOME');
1 row created.
SQL> commit;
Commit complete.
SQL> grant select on produto to teste;
Grant succeeded.
SQL> conn teste/teste
Connected.
SQL> select * from produto;
select * from produto
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from prod.produto;
NOME
----------
Lana
ORACLEHOME
Observe que não temos como efetuar um select direto na tabela, antes temos que colocar o nome do owner que é dono da tabela.
Mas se criarmos um sinonimo para ela podemos efetuar o acesso direto.
Observe.
SQL> conn / as sysdba Connected. SQL> grant create synonym to teste; Grant succeeded. SQL> conn teste/teste Connected. SQL> create or replace synonym produto for prod.produto; Synonym created. SQL> select * from produto; NOME ---------- Lana ORACLEHOME
Este sinonimo acima é um caso de sinonimo privado pois só serve para este owner.
Mas também temos como criar um sinonimo publico que servirá para todos os owners do banco.
Observem.
SQL> conn prod/prod
Connected.
SQL> create table fornecedor (nome varchar2(10));
Table created.
SQL> insert into fornecedor values('lana');
1 row created.
SQL> insert into fornecedor values('ORACHOME');
1 row created.
SQL> commit;
Commit complete.
SQL> create or replace public synonym fornecedor for prod.fornecedor;
Synonym created.
SQL> conn / as sysdba
Connected.
SQL> grant select on fornecedor to teste;
Grant succeeded.
SQL> conn teste/teste
Connected.
SQL> select * from fornecedor;
NOME
----------
lana
ORACHOME
SQL> conn / as sysdba
Connected.
SQL> grant select on fornecedor to lana;
Grant succeeded.
SQL> conn lana/lana
Connected.
SQL> select * from fornecedor;
NOME
----------
lana
ORACHOME
Observem que eu utilizei o mesmo sinonimo para acessar a tabela do owner “prod” com os owners lana e teste, sendo apenas necessário um grant.
Espero ter ajudado.
Autor: Leandro Lana
Trabalho com banco de dados Oracle desde 2006, já trabalhei com as plataformas 9i, 10G, 11G, 12C, 18C, 19C e 21(ainda em testes).
Trabalhando atualmente como consultor Oracle na MigraTI Soluções em TI como administrador de banco de dados Oracle, SQL-Server, MySQL e Postgresql.
Contato: leandro.lana@migrati.com.br
Fone: (47) 9191-6052 / (47) 3328 0996
Certificações:
OCA 10G.
OCP 10G.
OCE Linux.
OCE RAC/Cluster.
MCP SQL-Server 2008.
MCITP SQL-Server 2008.
DB2 Fundamentals.






