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.