Arquivo para ‘Manutenção de Objetos’ Categoria

Criando e Gerenciando Sinônimos - Oracle

domingo, junho 21st, 2009

Olá Pessoal depois de uma longa jornada de estudos para prova 1Z0-042, finalmente de volta postando mais um artigo.
Hoje iremos abordar um assunto que para muitos pode ser fácil, mas ja vi muitos desenvolvedores e iniciantes com dúvidas ao criarem sinonimos e não entenderem o que realmente estão fazendo. Eu mesmo era uma dessas pessoas que no início não sabia o que estava fazendo quando rodava scripts de criação de Sinonimos. Apenas rodava o script por rodar.
Se você é uma dessas pessoas que so rodam scripts de criação de sinonimos e não entende como realmente cria ou gerencia sinonimos, vale apena dar uma lida neste artigo.

Mas o que seriam Sinonimos(Synonyms)?

- Sinonimos nada mais é que um alias de um objeto de um outro SCHEMA para outro.

Um sinonimo pode ser criado para uma table, view, sequence, procedure, function ou package no Banco de Dados Local.
Podemos também criar sinonimo via Database Link para um objeto em um outro Banco de Dados.

——————————————————————————————————-
Existem 2 tipos de sinonimos:

- Sinonimos Privados (Default)
Sinonimos Privados são mais recomendados por motivo de segurança.
Criando Sinonimo Privado:
CREATE OR REPLACE SYNONYM <synonym_name> FOR <object_name>;
Dropando Sinonimo Privado:
DROP SYNONYM <synonym_name>;

- Sinonimos Públicos
Somente Usuarios com Privilegio DBA podem criar Sinonimos Publicos.
O Sinonimo Publico estará disponivel para todos os Usuários do Banco de Dados com os privilégios apropriados.
Criando Sinonimo Publico:
CREATE OR REPLACE PUBLIC SYNONYM <synonym_name> FOR <object_name>;
Dropando Sinonimo Publico:
DROP PUBLIC SYNONYM <synonym_name>;

——————————————————————————————————-

Bom então para entendermos melhor simularemos um ambiente. Segue abaixo o ambiente:
- Temos o usuario(Schema)Bruno que contém a Tabela Cliente.

- Temos o usuairo(Schema)Murassaki que gostaria de executar SELECT na Tabela Cliente do Usuario Bruno.

- Objetivo: Criar Sinonimo Privado para o Usuario Murassaki no qual terá privilégio de executar SELECT na Tabela Cliente pertencente ao Usuario Bruno.

——————————————————————————————————-

Passo1: Conectar com usuario SYS ou SYSTEM, conceder privilegio de Criar Sinonimo ao Usuario Murassaki:

SQL> GRANT CREATE SYNONYM TO MURASSAKI;

Grant succeeded.

——————————————————————————————————-

Passo2: Conectar com usuario Bruno e conceder privilegio de SELECT na tabela Cliente para o Usuario Murassaki:

SQL> GRANT SELECT ON CLIENTE TO MURASSAKI;

Grant succeeded.

Obs:Lembrando que neste passo2 é o momento em define o nível de privilegio a ser concedido. Neste caso apenas o privilégio de SELECT.

——————————————————————————————————-

Passo3: Podemos verificar ao conectar no Usuario Murassaki antes de criarmos o sinonimo notaremos que ja temos acesso a tabela Cliente:

SQL> SELECT * FROM BRUNO.CLIENTE;

ID NAME
———- ——————————
1 JOSE
2 MARIA
3 JOANA
4 JOAO

Alguns podem estar se perguntando, mas pra que o sinonimo? Ai é que está, ele serve para não precisar referenciar o nome do <Usuario.Tabela> e sim apenas o nome da Tabela como se fosse parte do Schema Murassaki.

——————————————————————————————————-

Passo4: Conectar com usuario Murassaki e criar o sinonimo da Tabela Cliente.

SQL> CREATE OR REPLACE SYNONYM CLIENTE FOR BRUNO.CLIENTE;

Synonym created.

——————————————————————————————————-

Passo5: Ainda conectado com usuario Murassaki ja podemos testar o sinonimo:

SQL> SELECT * FROM CLIENTE;

ID NAME
———- ——————————
1 JOSE
2 MARIA
3 JOANA
4 JOAO

——————————————————————————————————-

Pronto Sinonimo criado com sucesso.

Espero ter ajudado e esclarecido algumas dúvidas.

Abraço

Bruno Murassaki

Problema ao Recompilar Package após atualizar Banco de Dados

segunda-feira, março 23rd, 2009

Olá Pessoal

Hoje estarei compartilhando um Problema (Erro) que me fez perder um bom tempo para resolver.

Tudo isso devido o Programa PL/SQL Developer não conseguir recompilar todas as Packages com sucesso.

Recompilei Package por Package e Trigger por Trigger e nada com PL/SQL Developer.

Com isso resolvi mudar a forma de recompilar utilizando a Procedure compile_schema da Package DBMS_UTILITY com SQLPLUS.

Segue abaixo a situação do ambiente e como resolvi.

————————————————————————————-

ERRO SOLICITADO:
Erro após atualizar um Package ou Trigger no Banco de Dados.

ORA-04061: Existing state of string has been invalidated.

ORA-04061: Estado existente de package (USER.REPLIC) foi invalidado.

ORA-06508: PL/SQL: não foi localizada a unidade de programa que está sendo chamada: (USER.REPLIC).

ORA-04088: Erro durante a execução do gatilho (USER.T_COM_FECHAMENTO_IMPORTACAO).

————————————————————————————

CAUSA:
Tentativa de reiniciar a execução de um Package usando existente estado que tem tornado inválido ou inconsistente com o Package, porque o Package tem sido alterado ou dropado.

Programa PL/SQL Developer recompila todos os objetos, consta a Package como compilada com sucesso, mas quando roda a aplicação da Erro na Package.

————————————————————————————

SOLUÇÃO:
Tentar novamente recompilar todos os Pacotes; este erro deveria ser causado a situação atual de todos os pacotes para ser re-inicializado. Executar DBMS_UTILITY.compile_schema.

A Procedure COMPILE_SCHEMA na Package DBMS_UTILITY compila todas as Procedures, Functions, Packages, e Triggers em um Schema específico.

Conectar como SYS ou SYSTEM no SQLPLUS e executar o seguinte comando setando o Schema:

SQL>exec dbms_utility.compile_schema(schema=>’nomeschema’);

Procedimento PL/SQL concluído com sucesso.

Pronto, objetos recompilados com sucesso.

Abraço,

Bruno Murassaki

Alterando uma Tabela em um Banco de Dados Oracle

terça-feira, fevereiro 10th, 2009

Sei que para muitos pode ser básico este conceito, mas já vi muitos programadores com dúvidas. Por isso estarei postando sobre como alterar uma tabela em um Banco de Dados Oracle.

Em um Banco de Dados Oracle existem 2 caminhos para adicionar um Valor Default para uma coluna.

ALTER TABLE … ADD   E   ALTER TABLE … MODIFY

1)Declaração ALTER TABLE … ADD:
EXEMPLO:
SQL> ALTER TABLE table_name ADD column_name data_type DEFAULT default_value

Com essa declaração você pode adcionar uma coluna fornecendo um valor padrão para coluna.
Se você adicionar um valor default com este caminho(ALTER TABLE …ADD) o Banco de Dados Oracle
atualizará para cada linha na nova coluna o valor DEAFULT que você especificou.
E irá disparar triggers AFTER UPDATE definido na Tabela.

————————————————————————————————————

2)Declaração ALTER TABLE … MODIFY:
EXEMPLO:
SQL> ALTER TABLE table_name MODIFY column_name DEFAULT default_value

Com essa declaração você pode modificar um valor da coluna para um valor Default.
Mas semelhante ao ALTER TABLE…ADD, o MODIFY não atualizará todos os valores das colunas na tabela.
Subsequentemente irá inserir determinado valor default se nenhum valor é fornecido.

Abraço,

Bruno Murassaki