Trigger referente a um único campo.

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
reneanarcizo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 11 Mar 2010 2:36 pm
Localização: Campinas - SP
Renê Narcizo

PessoAll, bom dia.

Estou com uma dúvida e gostaria de ajuda para saná-la.

Tenho uma tabela com vários campos, dentre eles existem 2 que preciso que possuam o mesmo valor (COD_PROCESSO e NUM_CLIENTE).

Preciso fazer uma trigger para a cada INSERT ou UPDATE no campo COD_PROCESSO, ele copiar o conteúdo desse campo e adicionar também no campo NUM_CLIENTE.

Até o momento estou com a seguinte trigger:

create or replace trigger TRG_PREENCHE_NUM_CLIENTE
after insert or update on CADASTRO_CLIENTE
for each row
declare
-- local variables here
begin
update ORDENS_IMPORTACAO SET NUM_CLIENTE = NUM_ORDEM
end TRG_PREENCHE_NUM_CLIENTE;


Porém, nesse caso além de estar recebendo mensagem de erro, tenho a impressão de que para cada novo cadastro a trigger fará a alteração de todo o conteúdo da tabela!!!

Informações do Ambiente:
* Versão do Oracle: 10G
* Sistema Operacional: Win 2k3
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

presumindo que uma das tabelas possui chave estrangeira apontando para a outra, ficaria assim:

Selecionar tudo

create or replace trigger TRG_PREENCHE_NUM_CLIENTE
  after insert or update of COD_PROCESSO on CADASTRO_CLIENTE
  for each row
begin
  update ORDENS_IMPORTACAO SET NUM_CLIENTE = :NEW.COD_PROCESSO WHERE CAMPO_X = :NEW.CAMPO_Y;
end TRG_PREENCHE_NUM_CLIENTE;
Sendo que CAMPO_X (no código) é ou a PK da tabela ORDENS_IMPORTACAO que é apontada pela FK CAMPO_Y da tabela CADASTRO_CLIENTE ou o contrário (FK que aponta para PK da outra).

Segue esta linha de pensamento que funciona...
reneanarcizo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 11 Mar 2010 2:36 pm
Localização: Campinas - SP
Renê Narcizo

Burga, boa noite...

muito obrigado por sua ajuda, mas eu cometí um engano no envio da trigger...

Segue abaixo a trigger que estou utilizando:

create or replace trigger TRG_PREENCHE_NUM_CLIENTE
after insert or update of NUM_ORDEM on CADASTRO_CLIENTES
for each row
begin
update CADASTRO_CLIENTES SET NUM_CLIENTE = :NEW.NUM_ORDEM
WHERE NUM_ORDEM = :NEW.NUM_ORDEM;
COMMIT;
end TRG_IS_PREENCHE_NOME_CLIENTE;


desculpa, eu misturei as coisas e enviei coisa errada... hehehe

Como pode ver, trata-se de um update em um campo na mesma linha...

Ao executar a trigger acima, recebo as seguintes mensagens de erro:

ORA-04091 - A TABELA CADASTRO_CLIENTES É MUTANTE; TALVEZ O GATILHO/FUNÇÃO NÃO POSSA LOCALIZÁ-LA.
ORA-06512 - EM "CADASTRO_CLIENTES", LINE 2
ORA-04088 - ERRO DURANTE A EXECUÇÃO DO GATILHO;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5026
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Você tem que usar uma trigger BEFORE INSERT ou UPDATE.
Dai basta setar o campo :NEW.campo = xxxxxxx

Dessa forma você consegue manipular os dados antes de insert ou update acontecer.
Tente dessa forma!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante