Trigger no Oracle não executa

Oracle

07/01/2004

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 !
Pablopn

Pablopn

Curtidas 0

Respostas

Motta

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 ?


GOSTEI 0
Pablopn

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 !!!


GOSTEI 0
Orlandodias

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


GOSTEI 0
Fabio Colli

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

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.
GOSTEI 0
Henrique Silveira

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.


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
POSTAR