Trigger no Oracle não executa
Olá pessoal !!!
Estou tendo um probleminha com triggers no Oracle.
Eu implementei um trigger before update para que impor algumas regras de negócio. Quando faço um update pelo Toad ou SQLPlus para testar se a regra está implementada corretamente, o trigger funciona e barra a transação.
Porém se faço esta mesmo update pela aplicação que é em Delphi (Conexão ADO e componente ADOQuery) o trigger não funciona e o update é realizado.
Alguém saberia dizer o porque que esta alteração não está passando pelo trigger e assim possa me ajudar ?
Obrigado !
Estou tendo um probleminha com triggers no Oracle.
Eu implementei um trigger before update para que impor algumas regras de negócio. Quando faço um update pelo Toad ou SQLPlus para testar se a regra está implementada corretamente, o trigger funciona e barra a transação.
Porém se faço esta mesmo update pela aplicação que é em Delphi (Conexão ADO e componente ADOQuery) o trigger não funciona e o update é realizado.
Alguém saberia dizer o porque que esta alteração não está passando pelo trigger e assim possa me ajudar ?
Obrigado !
Pablopn
Curtidas 0
Respostas
Motta
07/01/2004
triggers são disparadas independente da aplicação que alterou a tabela.
a trigger está habilitada (enabled) ?
há algo no código que trate user ou aplicação ?
a trigger está habilitada (enabled) ?
há algo no código que trate user ou aplicação ?
GOSTEI 0
Pablopn
07/01/2004
Não existe nenhuma restrição quanto a usuário ou aplicação.
A tela de cadastro tem apenas um grid e dois botões : Inserir e Confirmar. No botão ´inserir´ eu chamo o método Insert para inserir um registro novo no componente ADOQuery.
No botão ´confirmar´ eu uso o Post do ADOQuery para commitar as alterações no banco.
Nesse momento que executo o Post, o trigger não é disparado e a transação é confirmada quando o correto era que fosse revertida pela regra imposta no trigger.
Existe alguma propriedade no objeto de Conexão ou na Query que eu tenha que modificar ?
Desde já, obrigado !!!
A tela de cadastro tem apenas um grid e dois botões : Inserir e Confirmar. No botão ´inserir´ eu chamo o método Insert para inserir um registro novo no componente ADOQuery.
No botão ´confirmar´ eu uso o Post do ADOQuery para commitar as alterações no banco.
Nesse momento que executo o Post, o trigger não é disparado e a transação é confirmada quando o correto era que fosse revertida pela regra imposta no trigger.
Existe alguma propriedade no objeto de Conexão ou na Query que eu tenha que modificar ?
Desde já, obrigado !!!
GOSTEI 0
Orlandodias
07/01/2004
Parece que vc criou um trigger BEFORE UPDATE, quando DEVERIA ser BEFORE UPDATE E BEFORE INSERT.
Na sua útima mensagem parece que vc está disparando um INSERT e não um UPDATE.
Sds,
OD
Na sua útima mensagem parece que vc está disparando um INSERT e não um UPDATE.
Sds,
OD
GOSTEI 0
Fabio Colli
07/01/2004
Eu estou com este mesmo problema, um trigger no BEFORE UPDATE, pelo PL/SQL o trigger funciona perfeitamente, porém quando executo na aplicação no funciona. Detalhe, não uso post, como tenho um FrameWork, ele pega os campos que estão sendo alterados e monta um script de UPDATE: ´UPDATE NOME_TABELA SET NOME_CAMPO WHERE CHAVES´ e executa através do componente Query.
GOSTEI 0
Henrique Silveira
07/01/2004
Caros, sei que é uma dúvida antiga, más caso alguém leia isso com o mesmo problema, veja se isso ajuda:
Pode ser um problema visibilidade de user, exe:
se vc criar um trigger assim :
CREATE OR REPLACE TRIGGER <SEU USUARIO>.NOME_TRIGGER, pode ser que a aplicação não se conecta no banco com esse usuário e por isso ela ignora.
Por isso se vc conecta no banco via sqlplus e teste o trigger, o usuário é afetado e o gatilho funciona.
experimente fazer assim:
CREATE OR REPLACE TRIGGER NOME_TRIGGER, sem o user.
Espero poder ter contribuído.
Pode ser um problema visibilidade de user, exe:
se vc criar um trigger assim :
CREATE OR REPLACE TRIGGER <SEU USUARIO>.NOME_TRIGGER, pode ser que a aplicação não se conecta no banco com esse usuário e por isso ela ignora.
Por isso se vc conecta no banco via sqlplus e teste o trigger, o usuário é afetado e o gatilho funciona.
experimente fazer assim:
CREATE OR REPLACE TRIGGER NOME_TRIGGER, sem o user.
Espero poder ter contribuído.
GOSTEI 0
Henrique Silveira
07/01/2004
Caros, sei que é uma dúvida antiga, más caso alguém leia isso com o mesmo problema, veja se isso ajuda:
Pode ser um problema visibilidade de user, exe:
se vc criar um trigger assim :
CREATE OR REPLACE TRIGGER <SEU USUARIO>.NOME_TRIGGER, pode ser que a aplicação não se conecta no banco com esse usuário e por isso ela ignora.
Por isso se vc conecta no banco via sqlplus e teste o trigger, o usuário é afetado e o gatilho funciona.
experimente fazer assim:
CREATE OR REPLACE TRIGGER NOME_TRIGGER, sem o user.
Espero poder ter contribuído.
Pode ser um problema visibilidade de user, exe:
se vc criar um trigger assim :
CREATE OR REPLACE TRIGGER <SEU USUARIO>.NOME_TRIGGER, pode ser que a aplicação não se conecta no banco com esse usuário e por isso ela ignora.
Por isso se vc conecta no banco via sqlplus e teste o trigger, o usuário é afetado e o gatilho funciona.
experimente fazer assim:
CREATE OR REPLACE TRIGGER NOME_TRIGGER, sem o user.
Espero poder ter contribuído.
Outro ponto que deve ser válido verificar é que a aplicação pode fazer um:
DELETE FROM table
WHERE campo1 = ''XX''
RETURNING campo1,campo2,campo3 INTO :O0 ,:O1 ,:O2;
e inserir os dados.
Pode validar na
select distinct sql_text from gv$sql where upper(sql_text) like ''%table%''; todas as instruções que chegaram na tabela em questão.
Espero poder ter contribuído
GOSTEI 0