Trigger - Sincronizar dados de duas tabelas

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Mensagemem Qui, 13 Jan 2005 4:21 pm

Olá pessoal

Tenho duas tabelas A e B que tem colunas semelhantes. Quando eu altero um campo em uma, também altero o campo correspondente em outra. E vice-versa. O ideal era fazer esse controle por trigger, mas entrou em loop, pois quando altero na A, dispara a trigger para alterar na B, quando altera na B dispara a trigger para alterar na A.
Alguém já passou por essa situação ?
Obrigado.
lamanita
Localização: Porto Alegre - RS

Samuel, o lamanit@

Mensagemem Qui, 13 Jan 2005 4:43 pm

Essas tabelas são no mesmo esquema?

Eu já fiz isso com tabelas em esquemas diferentes. Daí eu colocava bem no início do código assim:

No Esquema BRASIL:
Código: Selecionar todos
IF user='BRASIL' 
THEN
  código...  atualiza tabelas no esquema EUA
  código...
END IF;


e no Esquema EUA:
Código: Selecionar todos
IF user='EUA' 
THEN
  código...  atualiza tabelas no esquema BRASIL
  código...
END IF;


Dessa forma, a trigger seria rodada apenas uma vez!
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qui, 13 Jan 2005 4:45 pm

Sim, estão no mesmo...

Poderia me explicar melhor como tu faz com o esquema diferente, de repente eu possa dar um jeito de pedir pra trocarem o esquema.

Tu pega o onwer da tabela ou o usuário de banco ?
lamanita
Localização: Porto Alegre - RS

Samuel, o lamanit@

Mensagemem Sex, 14 Jan 2005 12:27 pm

Eu tinha 2 sistemas rodando no mesmo servidor. (cada sistema, com um owner diferente)

O controle de usuários era a nível de sistema, ou seja, todos usuários se logavam com o mesmo usuário no banco e o sistema controlava.

Com isso, era possível fazer integrações de algumas tabelas: Tudo que era alterado num owner, era também alterado numa tabela equivalente no outro owner - para fins de integração dos sistemas.

Como era feito?
Ele testava na trigger quem era o USER que estava fazendo a alteração!
Já que cada sistema só alterava as suas próprias tabelas, a trigger testava se o USER fazendo a alteração era o mesmo. Se não fosse, isso significava que era fruto de um "LOOP" e parava por aí...
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Sex, 14 Jan 2005 1:15 pm

Aqui os usuários do sistema são user do banco também...
lamanita
Localização: Porto Alegre - RS

Samuel, o lamanit@

Mensagemem Seg, 17 Jan 2005 2:12 pm

Então você pode fazer assim:

* Crie uma package que guarda uma variável. Já que essa variável é visível durante a sessão, você pode definir ali se é pra inserir.
Quando estiver inserindo na primeira, MUDE o valor, pois quando a trigger da outra for chamada, ela não vai inserir.

Pra exemplificar, eis o código:

Criando as tabelas
Código: Selecionar todos
create table x(id number,col1 varchar2(10))
/
create table y(id number,col1 varchar2(10))
/


Criando o pacote
Código: Selecionar todos
create or replace package test_pkg is
update_from_trigger boolean := false;
end;
/


Criando as triggers
Código: Selecionar todos
create or replace trigger x_bir_bur_bdr_trg
before insert or update or delete on x
for each row
begin

  if test_pkg.update_from_trigger = false then
     test_pkg.update_from_trigger := true;

     if inserting then
        insert into y (id,col1)
        values (:new.id,:new.col1);
     elsif updating then
           update y set col1 = :new.col1
           where id = :new.id;
     elsif deleting then
           delete from y
           where id = :old.id;
     end if;
  end if;

  test_pkg.update_from_trigger := false;
end;
/

create or replace trigger y_bir_bur_bdr_trg
before insert or update or delete on y
for each row
begin

  if test_pkg.update_from_trigger = false then
     test_pkg.update_from_trigger := true;

     if inserting then
        insert into x (id,col1)
        values (:new.id,:new.col1);
     elsif updating then
           update x set col1 = :new.col1
           where id = :new.id;
     elsif deleting then
           delete from x
           where id = :old.id;
     end if;
  end if;
  test_pkg.update_from_trigger := false;

end;
/


Testando!
Código: Selecionar todos
SQL> insert into x values (1,'a');

1 row created.

SQL> select * from y;

        ID COL1
---------- ----------
         1 a

SQL> insert into y values (2,'b');

1 row created.

SQL>
SQL> select * from x;

        ID COL1
---------- ----------
         1 a
         2 b

SQL>
dr_gori
Localização: Portland, OR USA

Thomas F. G

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


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes