Bom, antes de responder uma obs importante : tou vendo que vc está programando 
nalguma GUI , tipo Oracle Forms, VB, Delphi ou coisa assim, aonde os dados são 
trazidos do db, o processamento ocorre primeiro na máquina-cliente e depois 
quando o usuário clicka nalgum botão de COMMIT aí sim é que o banco é acionado 
e recebe as eventuais alterações de dados... Tá ** MEGA CLARO ** que uma 
trigger de database , sendo assim, normalmente só vai disparar quando o tal 
botão de commit for acionado, yep ??? E mais, os dados alterados no banco 
normalmente só vai refletir na tela após algum tipo de comando de REFRESH, blz 
??? Veja lá se de repente a trigger já não está disparando e fazendo o UPDATE, 
certinho, mas falta o comando de refresh/requery na sua tool pra trazer o dado 
alterado.....
 Outra coisa, vejo que vc está ** sempre ** fazendo UPDATE apenas na tabela 
est_itensdeestoque : vc tem CERTEZA de que realmente rigorosamente TODOS os 
registros presentes na est_cadmaterial estão presentes TAMBÉM na 
est_itensdeestoque, de modo que SEMPRE seja o caso de só fazer um UPDATE ???? 
Mesmo ??? Pergunto isso porque, como sabemos, um UPDATE que não encontre 
registro nenhum **** NÃO É ***** considerado erro, o RDBMS rigorosamente Não 
vai te dar mensagem NENHUMA, okdoc ??
  E é claro, não tem a ver com a pergunta mas eu ** questiono ** a sua 
modelagem de ter uma tabela à parte : não seria um caso de ter a flag 
necessária na própria tabela-origem, e (se preciso) ter um índice de função que 
indexe só os registros ativos ?
  
 Isso posto, se o acima exposto não for cabível - não vejo nenhum erro per se 
no trigger, é mesmo fazer o DEBUG completo da tua lógica, principalmente 
checando as colunas-chave (principalmente essa coluna CODIGOMATINT, recheque 
que o teu UPDATE está corretamente acessando apenas e tão somente a linha 
certa, que os dados presentes ESTÃO gravados corretamente, etc), procurando por 
outras triggers, confirmando datatypes... Eu me preocuparia MUITO também com 
eventuais conflitos, tipo um outro usuário já estar alterando o registro que a 
trigger vai ter que acessar, coisas assim...
 Abaixo veja o exemplo :
 
 SQL> create table est_cadmaterial(
   CODIGOMATINT   number,
   DESCRICAO      varchar2(40),
   gerarateiomat  char(1)     );
 
 create table est_itensdeestoque (
   CODIGOMATINT   number,
   bloqueiamovtorateio char(1)
                                  );
   2    3    4  
Table created.

SQL> SQL>   2    3    4  
Table created.

SQL> create or replace TRIGGER TR_EST_BLOQUEIARATEIO
after insert or update on est_cadmaterial
for each row when (new.gerarateiomat = 'S')
BEGIN
    if updating then
        UPDATE est_itensdeestoque SET bloqueiamovtorateio = 'S' WHERE 
CODIGOMATINT = :old.codigomatint;
    else 
        UPDATE est_itensdeestoque SET bloqueiamovtorateio = 'S' WHERE 
CODIGOMATINT = :new.codigomatint;
    end if;
END;
  2    3    4    5    6    7    8    9   10   11  
 12  /

Trigger created.


==> Inserção dos registros na tabela-histórico, assegurando-se que o UPDATE da 
trigger vai funcionar :

SQL> insert into est_itensdeestoque values (1, 'N');

1 row created.

SQL> insert into est_itensdeestoque values (2, 'N');

1 row created.

SQL> commit;

Commit complete.

==> com os dados OK e presentes (E sem acesso concorrente, sem dados 
duplicados, com chave de acesso correta, blablabla), a trigger vai funcionar 
Perfeitamente :

SQL> insert into est_itensdeestoque values (1, 'N');

1 row created.

SQL> insert into est_itensdeestoque values (2, 'N');

1 row created.

SQL> commit;

Commit complete.

SQL> insert into est_cadmaterial values (1, 'Linha 1', 'N'); 

1 row created.

SQL> insert into est_cadmaterial values (2, 'LInha 2', 'S');

1 row created.

SQL> update est_cadmaterial set gerarateiomat = 'S' where CODIGOMATINT=1;

1 row updated.

SQL> select * from est_itensdeestoque ;

CODIGOMATINT B
------------ -
           1 S
           2 S

SQL> 

[]s

  Chiappa

Responder a