TRIGGER com JOIN

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
vladia
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 24 Jan 2007 3:40 pm
Localização: DF

Bom dia meus colegas...
Estou fazendo uma trigger na seguinte condição: Preciso impedir INSERT, UPDADE e DELETE na tabela PROMOCAO, desde de que este registros esteja com um determinado tipo na tabela MILITAR. Estou tendo grande dificuldade por causa desta consulta na tabela MILITAR. Dá erro no SQL, eu já tentei colocá-lo de outra maneira, mas retorna erro dizendo que não aceita esse tipo de consulta. O PLSQL ficou da seguinte maneira:

Selecionar tudo

CREATE OR REPLACE TRIGGER impede_promocao  
    BEFORE INSERT OR UPDATE OR DELETE  ON promocao
    FOR EACH ROW 
    DECLARE 
 	v_identificador	promocao.mil_pes_identificador_cod%TYPE;
	v_mil_type	VARCHAR2(1);
	...
BEGIN
      v_identificador := :old.mil_pes_identificador_cod;
      IF (USER <> 'RH_QUADRO' OR USER <> 'REPADMIN') THEN
	SELECT mil_type FROM militar 
	INTO  v_mil_type
	WHERE pes_identificador_cod = v_identificador;
	IF v_mil_type = 1 THEN
	     IF INSERTING THEN
		RAISE  v_erro_insert;
	     ELSIF UPDATING THEN
		RAISE  v_erro_update;
                    ELSIF DELETING THEN
		RAISE  v_erro_delete;
                    ...
END;
Alguém tem alguma dica de como posso usar esse tipo de consulta (JOIN)na TRIGGER?

OBRIGADA!!!!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pode nos dizer qual erro dá?
De cara, dá pra ver que CASO não exista na tabela MILITAR a trigger vai dar erro mesmo.

Selecionar tudo

SELECT mil_type FROM militar
   INTO  v_mil_type
   WHERE pes_identificador_cod = v_identificador; 
Aqui deveria ter um excption pra caso não retorne nenhuma linha.

Selecionar tudo

BEGIN
  SELECT mil_type FROM militar
  INTO  v_mil_type
  WHERE pes_identificador_cod = v_identificador; 
EXCEPTION WHEN NO_DATA_FOUND THEN .....
END;
Também vai dar erro se tiver mais que uma linha retornando. Pode ser solucionado colocando um

Selecionar tudo

    AND ROWNUM=1
Ou um outro exception:

Selecionar tudo

  WHEN TOO_MANY_ROWS THEN ....
Mesmo assim, mostra pra nós o que está dando de errado.
vladia
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 24 Jan 2007 3:40 pm
Localização: DF

:) Obrigada pela dica, mas a consulta deu certo, pois tinha um erro ridículo na consulta, só reparei quando tentei resolver o problema com uma FUNCTION.

Agora o problema é outro. Bom, a TRIGGER foi criada, mas eu preciso abrir a exceção desta trigger para dois usuários, fiz o seguinte:

Selecionar tudo

CREATE OR REPLACE TRIGGER impede_promocao  
    BEFORE INSERT OR UPDATE OR DELETE  ON promocao
    FOR EACH ROW 
    DECLARE 
 	...
     BEGIN
       IF (USER <> 'USUARIO_A' OR USER <> 'USUARIO_B') THEN --- AQUI *****
Da forma acima, deu um erro genérico. Eu soube que é relativo ao usuário porque quando testei da forma abaixo deu certo, porém só aceita um usuário.

Selecionar tudo

CREATE OR REPLACE TRIGGER impede_promocao  
    BEFORE INSERT OR UPDATE OR DELETE  ON promocao
    FOR EACH ROW 
    WHEN (USER <> 'USUARIO_A')   --- AQUI *****
    DECLARE 
 	...
BEGIN
       ...
Alguém saberia se há como restringir os dois usuários de uma vez?

Obrigada!!!
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

coloca o seguinte....

Selecionar tudo

 BEGIN
IF USER not in('USUARIO_A', 'USUARIO_B') THEN 
vê se dá certo =D
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP

O exemplo citado acima esta correto.

Acho que você também pode utilizar a mesma logica que esta realizando:
Codigo:

Selecionar tudo

   -- IF (USER <> 'USUARIO_A' OR USER <> 'USUARIO_B') THEN 
   -- Obs.: Separe as condições, talves possa ser isso
   IF (USER <> 'USUARIO_A')  OR (USER <> 'USUARIO_B') THEN
Abração
vladia
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 24 Jan 2007 3:40 pm
Localização: DF

Valeu!! Deu certo!!
vladia
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 24 Jan 2007 3:40 pm
Localização: DF

Julian, só para efeito de informação, eu já tinha testado suas sugestões e não tinham dado certo. Aceita mesmo só um usuário usando a cláusula WHEN. De qualquer forma, obrigada!!
vladia
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 24 Jan 2007 3:40 pm
Localização: DF

Ops!! Testei essas opções com o IF também, não sei porquê, mas não tinham dado certo.
Responder
  • Informação