Mto obrigado Chiappa,
Com essa explicação agora entendi certinho como fazer e pra que serve.
Eu to usando o Oracle 11g, em uma Maquina Virtual com Enterprise Linux 5,
pra estudar.
Mto obrigado pela ajuda.


Em 18 de setembro de 2012 18:53, J. Laurindo Chiappa <jlchia...@yahoo.com.br
> escreveu:

> **
>
>
> Miltão, ele não diz mas SUPONDO que a tal tabela EMPLOYEE é a mesma usada
> para demonstrações a info sobre o salário do Gerente está em outro registro
> dessa MESMA tabela, então vai dar MUTATING se ele tentar fazer isso num
> trigger, okdoc ?
>
> Colega, antes de responder a sua pergunta sobre PL/SQL, fique Registrado
> que triggers muitas vezes *** Não São *** a melhor maneira de se fazer
> integridade de dados num ambiente Produção, pois :
>
> a) podem ser bypassadas por algumas tools de carga, e/ou em algumas
> situações impedir o funcionamento adequado de algumas tools (que tentem
> fazer direct path, por exemplo)
>
> b) podem interferir (às vezes seriamente) com a performance, já que (entre
> outras coisas) disparam uma vez a cada INSERT (imagine o overhead num
> ambiente com milhares de INSERTs ocorrendo) , não são parte do kernel do
> banco (são um elemento Externo, não escrito em C e sem possibilidade de
> usar ganchos e sub-rotinas internas do TRDBMS
>
> c) demandam Manutenção - natural, já que são construtos escritos por vc
>
> d) podem ter Diversos efeitos colaterais não previstos, vide
> http://www.oracle.com/technetwork/issue-archive/2008/08-sep/o58asktom-101055.html
>
> ==>> então Recursos nativos do database - como índices de função,
> constraints (seja em view materializadas seja em tabelas reais mesmo) e
> relacionados - deveriam ser considerados em primeiro lugar, okdoc ? Isso
> MESMO que alterações de modelagem sejam necessárias, tipo se adicionar no
> registro da tabela de empregados uma coluna oculta MGR_SAL que contém o
> salário do Gerente desse empregado, ter uma view materializada que
> "replica" a informação do salário do gerente para cada empregado, ou qquer
> coisa do tipo ... No caso específico de integridade de dados entre linhas
> diferentes da tabela (o que é o seu caso, aqui) Tem Autores que até
> defendem um outro approach : simplesmente REMOVER a permissão de INSERT
> nessa tabela e/ou UPDATE nessa coluna SALARIO e dar pra todos os
> interessados permissão de EXECUTE numa procedure ou função que vc escreveu
> e que faz todas as checagens antes de alterar o dado na tabela .... É outro
> ponto a considerar - não deixe de ler sobre essas possibilidades em
> http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:698031000346429496,
> http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:636506144470e
> http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4233459000346171405....
>
> Vou responder as suas perguntas em um senso acadêmico, pra vc aprender,
> mas fique Ciente das questões acima quando vc for programar/usar um RDBMS
> Oracle "de verdade", right ?
>
> Isso dito, as suas Respostas:
>
> 1. como creio que vc já sabe, para proteção / integridade de dados o RDBMS
> não permite que vc faça nem SELECTs na tabela quando há alterações
> pendentes (o que é o caso da trigger BEFORE), sob pena de erro MUTATING
> TABLE - não há como fazer isso na sua lógica, que usa justamente uma
> trigger BEFORE INSERT na tabela employees e o registro do gerente a obter o
> salário Também está na employees....Vc não diz mas Entendo que é esse o seu
> problema/dúvida aqui...
>
> Assim, para contornar isso SEM usar as opções melhores que citei lá no
> começo, vc poderia :
>
> - usar uma transação Autônoma que busque a info
>
> e/ou
>
> - ter uma trigger AFTER, que dispara após a inserção/alteração
>
> e/ou
>
> - SE a sua versão é 11g (o que vc não diz mas deveria, é SEMPRE
> aconselhável citar a versão) vc poderia talvez usar copound triggers, veja
> http://mikesmithers.wordpress.com/2010/04/24/compound-triggers-%E2%80%93-managing-the-mutant-menace/
>
> 2. sobe a Exception, não : vc Não Pode usar uma Exception para "mostrar"
> nada em princípio : o que uma EXCEPTION faz é desviar o fluxo do seu
> programa quando há um erro, mas por si só ela NÃO implica em "mensagem"
> alguma, nem em Abort do fluxo PL/SQL, nem em "aviso" algum, ok ? Vc até
> poderia na área de EXCEPTION usar um comando apropriado (e inclusive Se vc
> quer que o cliente que dez o SQL receba um warning E também que o SQL seja
> abortado/sinalizado com erro, RAISE_APPLICATION_ERROR é a opção), mas não é
> de forma alguma Obrigatório o EXCEPTION....
>
> []s
>
> Chiappa
>
>
> --- Em oracle_br@yahoogrupos.com.br, "Milton Bastos Henriquis Jr."
> <miltonbastos@...> escreveu
> >
> > Boa tarde!
> >
> > Suas perguntas já estão todas respondidas por você mesmo... rs....
> > Está tudo correto o que vc falou.
> >
> > Faça um SELECT INTO para pegar o valor do salário do gerente
> > do sujeito e armazenar numa variável.
> > Depois compare o valor do salário do sujeito com a variável...
> > Se for maior, vc dispara a exceção.
> >
> >
> >
> >
> > 2012/9/18 Antony Ferreira <tonyferreira3@...>
> >
> > > **
> > >
> > >
> > > Boa tarde pessoal,
> > >
> > > Estou começando a estudar um pouco de PL/SQL e me surgiu umas duvidas.
> > > Tenho a seguinte trigger:
> > >
> > > CREATE OR REPLACE TRIGGER imp_novos_emp
> > > BEFORE INSERT OR UPDATE ON employees
> > > FOR EACH ROW
> > > BEGIN
> > > IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP')) THEN
> > > IF :NEW.salary > 15000 THEN
> > > RAISE_APPLICATION_ERROR (-20202,'Este empregado não pode receber este
> > > valor');
> > > END IF;
> > > END IF;
> > > END imp_novos_emp;
> > > /
> > >
> > > Qual seria a melhor maneira para eu poder impedir que seja inserido um
> novo
> > > empregado que tenha o salario maior que o gerente.
> > >
> > > Eu teria que fazer uma consulta na coluna manager_id da tabela
> employees e
> > > verificar se o salario do empregado que eu estou add é maior que o do
> > > gerente?
> > > Outra duvida, posso colocar uma excessão para mostrar que o salario é
> > > invalido quando o salario do empregado que eu estou add é maior que o
> do
> > > gerente?
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> >
> >
> >
> > --
> > Att,
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

--------------------------------------------------------------------------------------------------------------------------
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  
------------------------------------------------------------------------------------------------------------------------
 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
    oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html


Responder a