D aniel 0 Denunciar post Postado Dezembro 27, 2012 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
Motta 645 Denunciar post Postado Dezembro 27, 2012 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
D aniel 0 Denunciar post Postado Dezembro 27, 2012 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
Motta 645 Denunciar post Postado Dezembro 27, 2012 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
D aniel 0 Denunciar post Postado Dezembro 27, 2012 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
Motta 645 Denunciar post Postado Dezembro 27, 2012 Veja se a trigger não está DISABLE (desabilitada). Compartilhar este post Link para o post Compartilhar em outros sites
D aniel 0 Denunciar post Postado Dezembro 27, 2012 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 Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Dezembro 27, 2012 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
D aniel 0 Denunciar post Postado Dezembro 27, 2012 A trigger é para o objeto que recebe o DELETE , no caso creio ser a tabela. Eu achei ela aqui na View, tá ativada. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Dezembro 27, 2012 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
D aniel 0 Denunciar post Postado Dezembro 27, 2012 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
D aniel 0 Denunciar post Postado Dezembro 27, 2012 Testei a trigger em outra base de dados e a trigger funcionou perfeitamente, Compartilhar este post Link para o post Compartilhar em outros sites