Criando, gerenciando e utilizando sinônimos no oracle.

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.

%name Criando, gerenciando e utilizando sinônimos no oracle.

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.