Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

D aniel

[Resolvido] Trigger para Before Delete, bloquear deleção de regis

Recommended Posts

Estou tentando criar uma trigger que impede de deletar um registro.

 

Funciona assim, na tabela de POGECAIX (Lançamentos no caixa) tem o campo TABECAIX, se no campo TABECAIX tiver salvo 'FICATRAN' impede de deletar por alí, mas nao sei o que acontece que não está funcionando.

 

Eu preciso fazer algum tipo de select para poder validar o registro?

 

create or replace
TRIGGER TRG_POGECAIX_BD_POCACAIX 
before delete 
ON POGECAIX
FOR EACH ROW

BEGIN

:OLD.TABECAIX = 'FICATRAN' THEN 

RAISE_APPLICATION_ERROR(-20000,'NÃO É POSSIVEL DELETAR ESTE REGISTRO, TABECAIX = FICATRAN'); 

END IF;
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

create or replace
TRIGGER TRG_POGECAIX_BD_POCACAIX 
before delete 
ON POGECAIX
FOR EACH ROW
BEGIN      
IF :OLD.TABECAIX = 'FICATRAN' THEN 
 RAISE_APPLICATION_ERROR(-20000,'NÃO É POSSIVEL DELETAR ESTE REGISTRO, TABECAIX = FICATRAN'); 
END IF;
END;

 

Parece correto, o que dá de errado ?

O valor já estaria "trancado" ?

Lembre porém que 'FICATRAN' <> 'FICATRAN ' <> 'ficatran' ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

create or replace
TRIGGER TRG_POGECAIX_BD_POCACAIX 
before delete 
ON POGECAIX
FOR EACH ROW
BEGIN      
IF :OLD.TABECAIX = 'FICATRAN' THEN 
 RAISE_APPLICATION_ERROR(-20000,'NÃO É POSSIVEL DELETAR ESTE REGISTRO, TABECAIX = FICATRAN'); 
END IF;
END;

 

Parece correto, o que dá de errado ?

O valor já estaria "trancado" ?

Lembre porém que 'FICATRAN' <> 'FICATRAN ' <> 'ficatran' ...

 

 

Não aparece nenhum erro, o sistema salva todos automáticos como FICATRAN.

Essa tabela POGECAIX possui uma view, POCACAIX, será que pode ser isso?

 

Eu tentei alterar o

create or replace
TRIGGER TRG_POGECAIX_BD_POCACAIX 
before delete 
ON POGECAIX

 

Para

 

TRIGGER TRG_POGECAIX_BD_POCACAIX 
instead of DELETE ON POCACAIX
FOR EACH ROW

 

Mas o compilador deu esse erro.

Variável de Bind "OLD" NÃO DECLARADA

bloco anônimo concluído

 

O que será que pode ser?

 

Eliminei aquela trigger antiga e criei outra pelo Developer e informei que era para uma View, e selecionei ela.

Aí, coloquei os códigos

 

CREATE OR REPLACE TRIGGER TRG_POGECAIX_BD_POCACAIX 
INSTEAD OF DELETE ON POCACAIX 
FOR EACH ROW
BEGIN

IF :OLD.TABECAIX = 'FICATRAN' THEN 

RAISE_APPLICATION_ERROR(-20000,'NÃO É POSSIVEL DELETAR ESTE REGISTRO, TABECAIX = FICATRAN'); 

END IF;

END;

 

Não deu o erro do compilador,

Mas mesmo assim, não deu certo ;/

Compartilhar este post


Link para o post
Compartilhar em outros sites

A trigger parece correta, um comando do tipo

 

DELETE POGECAIX WHERE ... 

 

Daria o erro ORA-20000 se algum registro envolvido na deleção tivesse

TABECAIX = 'FICATRAN'

(exatamente).

Compartilhar este post


Link para o post
Compartilhar em outros sites

A trigger parece correta, um comando do tipo

 

DELETE POGECAIX WHERE ... 

 

Daria o erro ORA-20000 se algum registro envolvido na deleção tivesse

TABECAIX = 'FICATRAN'

(exatamente).

 

O sistema aqui, tem um monitor, que dá para ver os ultimos códigos SQL executados a trigger nao chega a ser ativada.

Vou ver o que está ocorrendo,

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A trigger é para o objeto que recebe o DELETE , no caso creio ser a tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um teste :

 

CREATE TABLE TESTE_TRG
 (
   A  CHAR(1),
  B   CHAR(1)
  )

 TABLESPACE "DADOS_ADV_160K" ;

 --table TESTE_TRG criado.



create or replace
TRIGGER TRG_TESTE_TRG
before delete 
ON TESTE_TRG
FOR EACH ROW
BEGIN      
IF :OLD.B = '2' THEN 
 RAISE_APPLICATION_ERROR(-20000,'NÃO É POSSIVEL DELETAR ESTE REGISTRO, TABECAIX = FICATRAN'); 
end if;
END;

--TRIGGER TRG_TESTE_TRG compilado

insert into TESTE_TRG values ('1','1');
insert into TESTE_TRG values ('2','2');
--1 linhas inserido.
--1 linhas inserido.

delete TESTE_TRG where a = '1'
--1 linhas deletado.


delete TESTE_TRG where a = '2'

/*
Erro ao iniciar na linha 35 no comando
delete TESTE_TRG where a = '2'
Relatório de erro:
Erro de SQL: ORA-20000: NÃO É POSSIVEL DELETAR ESTE REGISTRO, TABECAIX = FICATRAN
ORA-06512: em "SIGA.TRG_TESTE_TRG", line 3
ORA-04088: erro durante a execução do gatilho 'SIGA.TRG_TESTE_TRG'
20000. 00000 -  "%s"
*Cause:    The stored procedure 'raise_application_error'
          was called which causes this error to be generated.
*Action:   Correct the problem as described in the error message or contact
          the application administrator or DBA for more information.
*/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um teste :

 

CREATE TABLE TESTE_TRG
 (
   A  CHAR(1),
  B   CHAR(1)
  )

 TABLESPACE "DADOS_ADV_160K" ;

 --table TESTE_TRG criado.


 Eu testei este código aqui, e nao deu erro, criou tudo, adicionou o registro e deletou ele.
create or replace
TRIGGER TRG_TESTE_TRG
before delete 
ON TESTE_TRG
FOR EACH ROW
BEGIN      
IF :OLD.B = '2' THEN 
 RAISE_APPLICATION_ERROR(-20000,'NÃO É POSSIVEL DELETAR ESTE REGISTRO, TABECAIX = FICATRAN'); 
end if;
END;

--TRIGGER TRG_TESTE_TRG compilado

insert into TESTE_TRG values ('1','1');
insert into TESTE_TRG values ('2','2');
--1 linhas inserido.
--1 linhas inserido.

delete TESTE_TRG where a = '1'
--1 linhas deletado.


delete TESTE_TRG where a = '2'

/*
Erro ao iniciar na linha 35 no comando
delete TESTE_TRG where a = '2'
Relatório de erro:
Erro de SQL: ORA-20000: NÃO É POSSIVEL DELETAR ESTE REGISTRO, TABECAIX = FICATRAN
ORA-06512: em "SIGA.TRG_TESTE_TRG", line 3
ORA-04088: erro durante a execução do gatilho 'SIGA.TRG_TESTE_TRG'
20000. 00000 -  "%s"
*Cause:    The stored procedure 'raise_application_error'
          was called which causes this error to be generated.
*Action:   Correct the problem as described in the error message or contact
          the application administrator or DBA for more information.
*/

 

Eu testei o código, e deu certo aqui, adicionou e excluiu os campos sem dar erro.

 

 

Agora consegui fazer dar o erro, vou testar na tabela, nao tinha pensado em fazer isso direto no banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.