Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;>
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 ;/
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).
>
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.
Veja se a trigger não está DISABLE (desabilitada).
>
Veja se a trigger não está DISABLE (desabilitada).
Acredito que não, só que a Trigger que eu criei para view, nao aparece na POGECAIX
A trigger é para o objeto que recebe o DELETE , no caso creio ser a tabela.
>
A trigger é para o objeto que recebe o DELETE , no caso creio ser a tabela.
Eu achei ela aqui na View, tá ativada.
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.
*/
>
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.
Testei a trigger em outra base de dados e a trigger funcionou perfeitamente,
create or replace
TRIGGER TRG_POGECAIX_BD_POCACAIX
before delete
ON POGECAIX
FOR EACH ROW
BEGIN
IF :OLD.TABECAIX = 'FICATRAN' THEN
Parece correto, o que dá de errado ?
O valor já estaria "trancado" ?
Lembre porém que 'FICATRAN' <> 'FICATRAN ' <> 'ficatran' ...