Re: [oracle_br] Triggers
Evandro 5h da manhã é dureza, heim! =) [ ] André Em 27 de fevereiro de 2010 21:38, Evandro Giachetto evandrogiache...@gmail.com escreveu: Boa André. Você colocou muito bem. Realmente escrevi o texto sem pensar muito nele pois, como pode ver, escrevi às 5h da manhã. Realmente não faz sentido colocar em um before insert. Um before insert or update or delete funcionaria like a charm... Evandro Giachetto Oracle SQL Expert Oracle Certified Associate evan...@clickinterativa.com.br Em 27 de fevereiro de 2010 13:35, Andre Santos andre.psantos...@gmail.comescreveu: Alessandro / Evandro Há um problema com essa abordagem: quando o conteúdo dos campos (versões new ou old) for nulo (NULL). Neste caso o operador de diferente (!= ou ) não vai retornar o resultado desejado. Claro que isso se aplica nas colunas que aceitam nulo. ;) Teria de ser algo como: IF :NEW.campo1 :OLD.campo1 OR ( :NEW.campo1 IS NULL AND :OLD.campo1 IS NOT NULL ) OR ( :NEW.campo1 IS NOT NULL AND :OLD.campo1 IS NULL ) THEN ... END IF; Outro detalhe: num trigger do tipo BEFORE INSERT não faz sentido comparar, pois os valores OLD sempre serão NULL. Poderia ser um trigger do tipo BEFORE INSERT OR UPDATE OR DELETE e, dentro do bloco PL/SQL, fazer uso de: IF UPDATING THEN ... END IF; Você também pode especificar o campo no verificador UPDATING, para saber se o campo foi alterado: IF UPDATING('campo1') THEN ... END IF; IF UPDATING('campo2') THEN ... END IF; O único problema de usar UPDATING('campo') é que não se sabe se o campo foi alterado para o mesmo valor. Por exemplo, se o campo1 = 'A' e o comando for: UPDATE teste SET campo1 = 'A' ... Para a atualização acima, mesmo não tendo mudado de fato (trocou seis por meia-dúzia... rs) o verificador UPDATING('campo1') retorna verdadeiro. Dê uma olhada na solução apresentada no Ask Tom: http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:59412348055 [ ]'s André Em 27 de fevereiro de 2010 05:38, Evandro Giachetto evandrogiache...@gmail.com evandrogiachetto%40gmail.com escreveu: trigger do tipo before insert. Você pode testar da seguinte forma: if :new.campo1 != :old.campo1 then ... end if; if :new.campo2 != :old.campo2 then ... end if Att. Evandro Giachetto Oracle SQL Expert Oracle Certified Associate evan...@clickinterativa.com.br evandro%40clickinterativa.com.br Em 26 de fevereiro de 2010 17:59, alessandro alessan...@micromap.com.br alessandro%40micromap.com.brescreveu: Boa Tarde pessoal Gostaria de saber se em uma trigger dá p/ saber qual campo está disparando esta trigger, por exemplo tenho uma tabela com +/- 30 campos e eu quero que qdo algum campo for alterado ele me mostre qual foi o campo que foi alterado p/ que eu gravei este campo alterado em uma tabela de logs. Desde já muito obrigado. [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ -- Links do Yahoo! Grupos [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ Links do Yahoo! Grupos [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] Triggers
trigger do tipo before insert. Você pode testar da seguinte forma: if :new.campo1 != :old.campo1 then ... end if; if :new.campo2 != :old.campo2 then ... end if Att. Evandro Giachetto Oracle SQL Expert Oracle Certified Associate evan...@clickinterativa.com.br Em 26 de fevereiro de 2010 17:59, alessandro alessan...@micromap.com.brescreveu: Boa Tarde pessoal Gostaria de saber se em uma trigger dá p/ saber qual campo está disparando esta trigger, por exemplo tenho uma tabela com +/- 30 campos e eu quero que qdo algum campo for alterado ele me mostre qual foi o campo que foi alterado p/ que eu gravei este campo alterado em uma tabela de logs. Desde já muito obrigado. [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ * Para sair deste grupo, envie um e-mail para: oracle_br-unsubscr...@yahoogrupos.com.br * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html
Re: [oracle_br] Triggers
Alessandro / Evandro Há um problema com essa abordagem: quando o conteúdo dos campos (versões new ou old) for nulo (NULL). Neste caso o operador de diferente (!= ou ) não vai retornar o resultado desejado. Claro que isso se aplica nas colunas que aceitam nulo. ;) Teria de ser algo como: IF :NEW.campo1 :OLD.campo1 OR ( :NEW.campo1 IS NULL AND :OLD.campo1 IS NOT NULL ) OR ( :NEW.campo1 IS NOT NULL AND :OLD.campo1 IS NULL ) THEN ... END IF; Outro detalhe: num trigger do tipo BEFORE INSERT não faz sentido comparar, pois os valores OLD sempre serão NULL. Poderia ser um trigger do tipo BEFORE INSERT OR UPDATE OR DELETE e, dentro do bloco PL/SQL, fazer uso de: IF UPDATING THEN ... END IF; Você também pode especificar o campo no verificador UPDATING, para saber se o campo foi alterado: IF UPDATING('campo1') THEN ... END IF; IF UPDATING('campo2') THEN ... END IF; O único problema de usar UPDATING('campo') é que não se sabe se o campo foi alterado para o mesmo valor. Por exemplo, se o campo1 = 'A' e o comando for: UPDATE teste SET campo1 = 'A' ... Para a atualização acima, mesmo não tendo mudado de fato (trocou seis por meia-dúzia... rs) o verificador UPDATING('campo1') retorna verdadeiro. Dê uma olhada na solução apresentada no Ask Tom: http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:59412348055 [ ]'s André Em 27 de fevereiro de 2010 05:38, Evandro Giachetto evandrogiache...@gmail.com escreveu: trigger do tipo before insert. Você pode testar da seguinte forma: if :new.campo1 != :old.campo1 then ... end if; if :new.campo2 != :old.campo2 then ... end if Att. Evandro Giachetto Oracle SQL Expert Oracle Certified Associate evan...@clickinterativa.com.br Em 26 de fevereiro de 2010 17:59, alessandro alessan...@micromap.com.brescreveu: Boa Tarde pessoal Gostaria de saber se em uma trigger dá p/ saber qual campo está disparando esta trigger, por exemplo tenho uma tabela com +/- 30 campos e eu quero que qdo algum campo for alterado ele me mostre qual foi o campo que foi alterado p/ que eu gravei este campo alterado em uma tabela de logs. Desde já muito obrigado. [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ Links do Yahoo! Grupos [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] Triggers
Boa André. Você colocou muito bem. Realmente escrevi o texto sem pensar muito nele pois, como pode ver, escrevi às 5h da manhã. Realmente não faz sentido colocar em um before insert. Um before insert or update or delete funcionaria like a charm... Evandro Giachetto Oracle SQL Expert Oracle Certified Associate evan...@clickinterativa.com.br Em 27 de fevereiro de 2010 13:35, Andre Santos andre.psantos...@gmail.comescreveu: Alessandro / Evandro Há um problema com essa abordagem: quando o conteúdo dos campos (versões new ou old) for nulo (NULL). Neste caso o operador de diferente (!= ou ) não vai retornar o resultado desejado. Claro que isso se aplica nas colunas que aceitam nulo. ;) Teria de ser algo como: IF :NEW.campo1 :OLD.campo1 OR ( :NEW.campo1 IS NULL AND :OLD.campo1 IS NOT NULL ) OR ( :NEW.campo1 IS NOT NULL AND :OLD.campo1 IS NULL ) THEN ... END IF; Outro detalhe: num trigger do tipo BEFORE INSERT não faz sentido comparar, pois os valores OLD sempre serão NULL. Poderia ser um trigger do tipo BEFORE INSERT OR UPDATE OR DELETE e, dentro do bloco PL/SQL, fazer uso de: IF UPDATING THEN ... END IF; Você também pode especificar o campo no verificador UPDATING, para saber se o campo foi alterado: IF UPDATING('campo1') THEN ... END IF; IF UPDATING('campo2') THEN ... END IF; O único problema de usar UPDATING('campo') é que não se sabe se o campo foi alterado para o mesmo valor. Por exemplo, se o campo1 = 'A' e o comando for: UPDATE teste SET campo1 = 'A' ... Para a atualização acima, mesmo não tendo mudado de fato (trocou seis por meia-dúzia... rs) o verificador UPDATING('campo1') retorna verdadeiro. Dê uma olhada na solução apresentada no Ask Tom: http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:59412348055 [ ]'s André Em 27 de fevereiro de 2010 05:38, Evandro Giachetto evandrogiache...@gmail.com evandrogiachetto%40gmail.com escreveu: trigger do tipo before insert. Você pode testar da seguinte forma: if :new.campo1 != :old.campo1 then ... end if; if :new.campo2 != :old.campo2 then ... end if Att. Evandro Giachetto Oracle SQL Expert Oracle Certified Associate evan...@clickinterativa.com.br evandro%40clickinterativa.com.br Em 26 de fevereiro de 2010 17:59, alessandro alessan...@micromap.com.br alessandro%40micromap.com.brescreveu: Boa Tarde pessoal Gostaria de saber se em uma trigger dá p/ saber qual campo está disparando esta trigger, por exemplo tenho uma tabela com +/- 30 campos e eu quero que qdo algum campo for alterado ele me mostre qual foi o campo que foi alterado p/ que eu gravei este campo alterado em uma tabela de logs. Desde já muito obrigado. [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ -- Links do Yahoo! Grupos [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ * Para sair deste grupo, envie um e-mail para: oracle_br-unsubscr...@yahoogrupos.com.br * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html
[oracle_br] Triggers para replicar inserts
Olá pessoal. Espero que alguém possa me ajudar. Oracle 10gR2, WinXPSP2, Linux RH4E. Estamos migrando gradativamente um esquema que é base para vários outros esquemas. As tabelas que referenciam este esquema (antigo) vão passar a referenciar o novo esquema, gradativamente, porque são muitos esquemas (um para cada aplicação). Bem, eu preciso replicar as alterações feitas em um esquema no outro (e vice-versa). Por exemplo, eu faço um insert no esquema 1 e este insert tem que ser replicado no esquema 2. Se é feito um insert no esquema 2 e este insert tem que ser replicado no esquema 1. O que me veio à cabeça foi o uso de triggers after insert nas tabelas dos dois esquemas, mas há o problema do código redundante, onde o insert no esquema 1 dispara a trigger para fazer o insert no esquema 2 que dispara a trigger para fazer o insert no esquema 1, e por aí vai. Bem, isso o Oracle não deixa, dá erro de cara (ORA-04091, ORA-06512 and ORA-04088). Preciso contornar isso de alguma forma. Eu pensei em usar contexts para identificar as sessões, mas ainda não consegui. Alguém já passou por algo semelhante ou tem alguma idéia? Anderson
Res: RES: [oracle_br] Triggers de replicação .
tente inativar a trigger Celso Henrique O. Souza - Mensagem original De: Fabio Santos [EMAIL PROTECTED] Para: oracle_br@yahoogrupos.com.br Enviadas: Terça-feira, 22 de Maio de 2007 19:36:03 Assunto: RES: [oracle_br] Triggers de replicação. pelo o que entendi, vc quer manter sempre duas tabelas iguais. se elas serao sempre as duas iguais, porque existir as duas e nao apenas uma? -Mensagem original- De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de Eduardo Enviada em: terça-feira, 22 de maio de 2007 17:40 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Triggers de replicação. Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] Apostilas » Dicas e Exemplos » Funções » Mundo Oracle » Package » Procedure » Scripts » Tutoriais acesse: http://www.oraclebr.com.br/codigo/ListaCodigo.php -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ Links do Yahoo! Grupos __ Fale com seus amigos de graça com o novo Yahoo! Messenger http://br.messenger.yahoo.com/ [As partes desta mensagem que não continham texto foram removidas]
Re: RES: [oracle_br] Triggers de replicação.
um dblink não resolve esse tipo de problema? On 5/23/07, Eduardo [EMAIL PROTECTED] wrote: É que é uma tabela de clientes, e tenho que ter as duas identicas nas duas instancias diferentes e não há a possibilidade de ter uma unica tabela. - Original Message - From: Celso Henrique Souza To: oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br Sent: Wednesday, May 23, 2007 9:00 AM Subject: Res: RES: [oracle_br] Triggers de replicação. tente inativar a trigger Celso Henrique O. Souza - Mensagem original De: Fabio Santos [EMAIL PROTECTED] santos%40brassites.com.br Para: oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br Enviadas: Terça-feira, 22 de Maio de 2007 19:36:03 Assunto: RES: [oracle_br] Triggers de replicação. pelo o que entendi, vc quer manter sempre duas tabelas iguais. se elas serao sempre as duas iguais, porque existir as duas e nao apenas uma? -Mensagem original- De: oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br [mailto: oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br] Em nome de Eduardo Enviada em: terça-feira, 22 de maio de 2007 17:40 Para: oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br Assunto: [oracle_br] Triggers de replicação. Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] Apostilas » Dicas e Exemplos » Funções » Mundo Oracle » Package » Procedure » Scripts » Tutoriais acesse: http://www.oraclebr.com.br/codigo/ListaCodigo.php -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ -- Links do Yahoo! Grupos __ Fale com seus amigos de graça com o novo Yahoo! Messenger http://br.messenger.yahoo.com/ [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] -- Os erros podem ser transformados em acertos quando com eles se aprende. Não existe a segurança do acerto eterno. [As partes desta mensagem que não continham texto foram removidas]
RES: [SPAM] Re: RES: [oracle_br] Triggers de replicação.
Se voce diz que não há possibilidade de ter apenas uma entao vou pressupor desse ponto. Bom, se você puder alterar a estrutura da tabela, pode fazer o seguinte: - Crie um campo nomeCampo nas duas tabelas. Esse campo irá dizer se o conteúdo é original de uma instancia ou da outra. Na trigger, vc verifica: IF nomeCampo IS NULL THEN -- insere na outra instancia insert into outrainstancia.tabela (..., nomeCampo) values (..., 'instanciaX') ELSE -- nao insere na outra instancia END IF; assim vc só irá inserir dados que não venham a pedido da trigger. Outra forma se tiver chave primaria: - faz uma query e verifica se o registro já existe. Se não existir, inclui. Lembre que todos esses tratamentos provavelmente também existir para delete e update. Abraços, Fabio Santos MSN: [EMAIL PROTECTED] Tel (47) 9601-4524 -- Estúdio Interativo http://www.estudiointerativo.com [EMAIL PROTECTED] Tel: (47) 3028-8821 (21) 4063-8634 -Mensagem original- De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de Eduardo Enviada em: quarta-feira, 23 de maio de 2007 10:55 Para: oracle_br@yahoogrupos.com.br Assunto: [SPAM] Re: RES: [oracle_br] Triggers de replicação. É que é uma tabela de clientes, e tenho que ter as duas identicas nas duas instancias diferentes e não há a possibilidade de ter uma unica tabela. - Original Message - From: Celso Henrique Souza To: oracle_br@yahoogrupos.com.br Sent: Wednesday, May 23, 2007 9:00 AM Subject: Res: RES: [oracle_br] Triggers de replicação. tente inativar a trigger Celso Henrique O. Souza - Mensagem original De: Fabio Santos [EMAIL PROTECTED] Para: oracle_br@yahoogrupos.com.br Enviadas: Terça-feira, 22 de Maio de 2007 19:36:03 Assunto: RES: [oracle_br] Triggers de replicação. pelo o que entendi, vc quer manter sempre duas tabelas iguais. se elas serao sempre as duas iguais, porque existir as duas e nao apenas uma? -Mensagem original- De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de Eduardo Enviada em: terça-feira, 22 de maio de 2007 17:40 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Triggers de replicação. Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] Apostilas » Dicas e Exemplos » Funções » Mundo Oracle » Package » Procedure » Scripts » Tutoriais acesse: http://www.oraclebr.com.br/codigo/ListaCodigo.php -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ -- Links do Yahoo! Grupos __ Fale com seus amigos de graça com o novo Yahoo! Messenger http://br.messenger.yahoo.com/ [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
RE: RES: [oracle_br] Triggers de replicaçã o.
Eduardo, seu caso é bem crítico... duas tabelas iguais, as duas online, as duas recebem comandos INS, DEL, UPD... complicado. E ainda não pode unificar ! piorou ! Uma coisa é certa ! trigger fazendo atualização cruzada não vai funcionar mesmo !!! sem dúvida ! O ideal seria centralizar a atualização ! atualizar apenas em uma delas e replicar pra outra... minimiza muito o trampo ! Agora, solução sempre tem ! opção sempre tem ! e cada caso se resolve de forma específica... respostas genéricas apenas dão uma noção pra onde vc deve atirar. Uma opção seria, cria um terceira tabela que controla a atualização. Ou seja, nela vc coloca apenas a chave e uma ou duas colunas de controle. E coloca um processo à parte, pode ser um job ou outra coisa, que rode de tempos em tempos (sem muita defasagem) pra ler a tabela de controle e atualizar as tabelas. Nessa tabela de controle vc colocaria além da chave de atualização, uma coluna com o controle, tipo um flag (bandeirinha) que sinaliza em qual sentido deve ser a atualização e se está pendente ou realizada. Por exemplo, vc cria uma coluna CHAR(1) com uma espécie de protocolo: A - atualizar tabela 1 com dados da tabela 2, status pendente B - atualizar tabela 2 com dados da tabela 1, status pendente C - atualizada tabela 1 com dados da tabela 2, status realizado D - atualizada tabela 2 com dados da tabela 1, status realizado sendo que este últimos poderia não existir e nesse caso vc apenas apagaria estes registros, ou seja, se existe é pq está pendente... caso contrário já apagaria da tabela... tudo depende se vc vai precisar de auditoria e histórico das transações. Espero ter dado mais um pouco de luz ! risos Abraço, Marco. From: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] On Behalf Of PUB: Eduardo Sent: quarta-feira, 23 de maio de 2007 10:55 To: oracle_br@yahoogrupos.com.br Subject: Re: RES: [oracle_br] Triggers de replicação. É que é uma tabela de clientes, e tenho que ter as duas identicas nas duas instancias diferentes e não há a possibilidade de ter uma unica tabela. - Original Message - From: Celso Henrique Souza To: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br Sent: Wednesday, May 23, 2007 9:00 AM Subject: Res: RES: [oracle_br] Triggers de replicação. tente inativar a trigger Celso Henrique O. Souza - Mensagem original De: Fabio Santos [EMAIL PROTECTED] mailto:santos%40brassites.com.br Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br Enviadas: Terça-feira, 22 de Maio de 2007 19:36:03 Assunto: RES: [oracle_br] Triggers de replicação. pelo o que entendi, vc quer manter sempre duas tabelas iguais. se elas serao sempre as duas iguais, porque existir as duas e nao apenas uma? -Mensagem original- De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br ] Em nome de Eduardo Enviada em: terça-feira, 22 de maio de 2007 17:40 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br Assunto: [oracle_br] Triggers de replicação. Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] Apostilas » Dicas e Exemplos » Funções » Mundo Oracle » Package » Procedure » Scripts » Tutoriais acesse: http://www.oraclebr.com.br/codigo/ListaCodigo.php http://www.oraclebr.com.br/codigo/ListaCodigo.php -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ http://www.oraclebr.com.br/ -- Links do Yahoo! Grupos __ Fale com seus amigos de graça com o novo Yahoo! Messenger http://br.messenger.yahoo.com/ http://br.messenger.yahoo.com/ [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
Re: RES: [oracle_br] Triggers de replicação.
Bota complexo nisso, Fernandes Eduardo, pra vc entender, pense por exemplo no seguinte caso, ao mesmo tempo o banco A pede um update na tabela e o banco B pede um delete, COMO que vc vai permitir que ambos executem são coisas EXCLUDENTES, vc não pode updatear o que está sendo deletado, é óbvio... Conflitos desse tipo é o que torna replicação onde ambos os lados podem fazer DMLs algo muuuito complexo - a tua abordagem de triggers é realmente, completamente ilógica, veja só : o banco A tem um trigger de INSERT na tabela T que faz insert na tabela T do banco B, E no banco B temos trigger que faz INSERT no A - ora, quando alguém mandar um insert no banco A (digamos), a trigger disparou e enviou um comando INSERT no B, ocorre que B recebendo o insert a trigger de insert dispara , que manda um INSERT no A, trigger do A dispara , manda INSERT no B, trigger N dispara Sacou a MONSTRUOSIDADE que vc tem feita aí ??? Só podia MESMO dar errado, vc tem em mãos uma lógica SEM A MENOR lógica... Bem, já que vc está escrevendo algo eu SUPONHO que : - vc tem dblink entre os bancos (óbvio) - hoje as duas tabelas são EXATAMENTE iguais - e que as features de replicação nativas do banco (inclusive replicação master/master) não podem ser usadas por algum motivo OBS : E vc diz que não pode ter uma tabela só (o que seria *** MESMO *** o mais fácil, eu tentaria MESMO batalhar por isso, mostre e explique pro teu cliente a complicação que é), vamos assumir que seja assim. .. Muito bem, nesse cenário de duas tabs, vc tem duas possibilidades principais, SERIALIZAÇÃO e ROTINA DE ATUALIZAÇÂO. Serialização seria algo do tipo : o dono das tabelas NÃO DÁ grants de INSERT/UPDATE/DELETE pra ninguém, ao invés da GRANT de execute em APIs (rotinas PL/SQL) apropriadas (uma pra INSERT, outra pra UPDATE e outra pra DELETE, digamos), e nessas rotinas antes de executar o DML vc manda um SELECT FROM tabela FOR UPDATE no registro da tabela local que está sendo alterado E um SELECT FROM [EMAIL PROTECTED] FOR UPDATE na tabela remota para esse mesmo registro, se conseguiu lockar ambos blz, vc manda o DML no registro local E no registro do bd remoto, se não conseguiu locar ambos os registros vc manda um erro pro usuário e manda o usuário pesquisar de novo daqui a pouco, trazendo assim a info refrescada, E refazer a operação passando os eventuais novos valores lidos pra API, e assim vai até conseguir. Já Atualização é a mais complexa, é o que outros colegas sugeriram, seria vc ter algum tipo de LOG das operações (numa outra tabela, num arquivo, via FLAG, o que for), log esse sequencial e disponível a AMBOS os bancos, que a cada período (no fim do dia, talvez) seria aplicado com a aplicação OFFLINE. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, FERNANDES Marco ASOFTTEK [EMAIL PROTECTED] escreveu Eduardo, seu caso é bem crítico... duas tabelas iguais, as duas online, as duas recebem comandos INS, DEL, UPD... complicado. E ainda não pode unificar ! piorou ! Uma coisa é certa ! trigger fazendo atualização cruzada não vai funcionar mesmo !!! sem dúvida ! O ideal seria centralizar a atualização ! atualizar apenas em uma delas e replicar pra outra... minimiza muito o trampo ! Agora, solução sempre tem ! opção sempre tem ! e cada caso se resolve de forma específica... respostas genéricas apenas dão uma noção pra onde vc deve atirar. Uma opção seria, cria um terceira tabela que controla a atualização. Ou seja, nela vc coloca apenas a chave e uma ou duas colunas de controle. E coloca um processo à parte, pode ser um job ou outra coisa, que rode de tempos em tempos (sem muita defasagem) pra ler a tabela de controle e atualizar as tabelas. Nessa tabela de controle vc colocaria além da chave de atualização, uma coluna com o controle, tipo um flag (bandeirinha) que sinaliza em qual sentido deve ser a atualização e se está pendente ou realizada. Por exemplo, vc cria uma coluna CHAR(1) com uma espécie de protocolo: A - atualizar tabela 1 com dados da tabela 2, status pendente B - atualizar tabela 2 com dados da tabela 1, status pendente C - atualizada tabela 1 com dados da tabela 2, status realizado D - atualizada tabela 2 com dados da tabela 1, status realizado sendo que este últimos poderia não existir e nesse caso vc apenas apagaria estes registros, ou seja, se existe é pq está pendente... caso contrário já apagaria da tabela... tudo depende se vc vai precisar de auditoria e histórico das transações. Espero ter dado mais um pouco de luz ! risos Abraço, Marco. From: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] On Behalf Of PUB: Eduardo Sent: quarta-feira, 23 de maio de 2007 10:55 To: oracle_br@yahoogrupos.com.br Subject: Re: RES: [oracle_br] Triggers de replicação. É que é uma tabela de clientes, e tenho que ter as duas identicas nas duas instancias diferentes e não
Re: RES: [oracle_br] Triggers de replicação.
sendo que este últimos poderia não existir e nesse caso vc apenas apagaria estes registros, ou seja, se existe é pq está pendente... caso contrário já apagaria da tabela... tudo depende se vc vai precisar de auditoria e histórico das transações. Espero ter dado mais um pouco de luz ! risos Abraço, Marco. From: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] On Behalf Of PUB: Eduardo Sent: quarta-feira, 23 de maio de 2007 10:55 To: oracle_br@yahoogrupos.com.br Subject: Re: RES: [oracle_br] Triggers de replicação. É que é uma tabela de clientes, e tenho que ter as duas identicas nas duas instancias diferentes e não há a possibilidade de ter uma unica tabela. - Original Message - From: Celso Henrique Souza To: oracle_br@yahoogrupos.com.br mailto:oracle_br% 40yahoogrupos.com.br Sent: Wednesday, May 23, 2007 9:00 AM Subject: Res: RES: [oracle_br] Triggers de replicação. tente inativar a trigger Celso Henrique O. Souza - Mensagem original De: Fabio Santos santos@ mailto:santos%40brassites.com.br Para: oracle_br@yahoogrupos.com.br mailto:oracle_br% 40yahoogrupos.com.br Enviadas: Terça-feira, 22 de Maio de 2007 19:36:03 Assunto: RES: [oracle_br] Triggers de replicação. pelo o que entendi, vc quer manter sempre duas tabelas iguais. se elas serao sempre as duas iguais, porque existir as duas e nao apenas uma? -Mensagem original- De: oracle_br@yahoogrupos.com.br mailto:oracle_br% 40yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br ] Em nome de Eduardo Enviada em: terça-feira, 22 de maio de 2007 17:40 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br% 40yahoogrupos.com.br Assunto: [oracle_br] Triggers de replicação. Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] Apostilas » Dicas e Exemplos » Funções » Mundo Oracle » Package » Procedure » Scripts » Tutoriais acesse: http://www.oraclebr.com.br/codigo/ListaCodigo.php http://www.oraclebr.com.br/codigo/ListaCodigo.php -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ http://www.oraclebr.com.br/ -- Links do Yahoo! Grupos __ Fale com seus amigos de graça com o novo Yahoo! Messenger http://br.messenger.yahoo.com/ http://br.messenger.yahoo.com/ [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
Re: RES: [oracle_br] Triggers de replicação.
Jlchiappa, Concordo plenamente com vc que e uma logica errada. Mas e que o sistema e fechado e ja tentei brigar com os desenvolvedores unificar isso, mas sem sucesso ainda. Vou analisar tudo que vc falou e pensar em alguma coisa, mas vai ter que ser on-line, a diferenca ai e que nao vou ter DELETE, somente INSERT E UPDATE nas duas tabelas. Essa ideia do Fernando p/ identificar se vem da trigger o pedido de INSERT E UPDATE acho que resolveria,a droga é que não posso mexer na estrutura dessas tabelas. Será que tem alguma forma nativa de saber se o pedido DML´s vem da trigger ? edu... - Original Message - From: jlchiappa To: oracle_br@yahoogrupos.com.br Sent: Wednesday, May 23, 2007 1:41 PM Subject: Re: RES: [oracle_br] Triggers de replicação. Bota complexo nisso, Fernandes Eduardo, pra vc entender, pense por exemplo no seguinte caso, ao mesmo tempo o banco A pede um update na tabela e o banco B pede um delete, COMO que vc vai permitir que ambos executem são coisas EXCLUDENTES, vc não pode updatear o que está sendo deletado, é óbvio... Conflitos desse tipo é o que torna replicação onde ambos os lados podem fazer DMLs algo muuuito complexo - a tua abordagem de triggers é realmente, completamente ilógica, veja só : o banco A tem um trigger de INSERT na tabela T que faz insert na tabela T do banco B, E no banco B temos trigger que faz INSERT no A - ora, quando alguém mandar um insert no banco A (digamos), a trigger disparou e enviou um comando INSERT no B, ocorre que B recebendo o insert a trigger de insert dispara , que manda um INSERT no A, trigger do A dispara , manda INSERT no B, trigger N dispara Sacou a MONSTRUOSIDADE que vc tem feita aí ??? Só podia MESMO dar errado, vc tem em mãos uma lógica SEM A MENOR lógica... Bem, já que vc está escrevendo algo eu SUPONHO que : - vc tem dblink entre os bancos (óbvio) - hoje as duas tabelas são EXATAMENTE iguais - e que as features de replicação nativas do banco (inclusive replicação master/master) não podem ser usadas por algum motivo OBS : E vc diz que não pode ter uma tabela só (o que seria *** MESMO *** o mais fácil, eu tentaria MESMO batalhar por isso, mostre e explique pro teu cliente a complicação que é), vamos assumir que seja assim. .. Muito bem, nesse cenário de duas tabs, vc tem duas possibilidades principais, SERIALIZAÇÃO e ROTINA DE ATUALIZAÇÂO. Serialização seria algo do tipo : o dono das tabelas NÃO DÁ grants de INSERT/UPDATE/DELETE pra ninguém, ao invés da GRANT de execute em APIs (rotinas PL/SQL) apropriadas (uma pra INSERT, outra pra UPDATE e outra pra DELETE, digamos), e nessas rotinas antes de executar o DML vc manda um SELECT FROM tabela FOR UPDATE no registro da tabela local que está sendo alterado E um SELECT FROM [EMAIL PROTECTED] FOR UPDATE na tabela remota para esse mesmo registro, se conseguiu lockar ambos blz, vc manda o DML no registro local E no registro do bd remoto, se não conseguiu locar ambos os registros vc manda um erro pro usuário e manda o usuário pesquisar de novo daqui a pouco, trazendo assim a info refrescada, E refazer a operação passando os eventuais novos valores lidos pra API, e assim vai até conseguir. Já Atualização é a mais complexa, é o que outros colegas sugeriram, seria vc ter algum tipo de LOG das operações (numa outra tabela, num arquivo, via FLAG, o que for), log esse sequencial e disponível a AMBOS os bancos, que a cada período (no fim do dia, talvez) seria aplicado com a aplicação OFFLINE. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, FERNANDES Marco A SOFTTEK [EMAIL PROTECTED] escreveu Eduardo, seu caso é bem crítico... duas tabelas iguais, as duas online, as duas recebem comandos INS, DEL, UPD... complicado. E ainda não pode unificar ! piorou ! Uma coisa é certa ! trigger fazendo atualização cruzada não vai funcionar mesmo !!! sem dúvida ! O ideal seria centralizar a atualização ! atualizar apenas em uma delas e replicar pra outra... minimiza muito o trampo ! Agora, solução sempre tem ! opção sempre tem ! e cada caso se resolve de forma específica... respostas genéricas apenas dão uma noção pra onde vc deve atirar. Uma opção seria, cria um terceira tabela que controla a atualização. Ou seja, nela vc coloca apenas a chave e uma ou duas colunas de controle. E coloca um processo à parte, pode ser um job ou outra coisa, que rode de tempos em tempos (sem muita defasagem) pra ler a tabela de controle e atualizar as tabelas. Nessa tabela de controle vc colocaria além da chave de atualização, uma coluna com o controle, tipo um flag (bandeirinha) que sinaliza em qual sentido deve ser a atualização e se está pendente ou realizada. Por exemplo, vc cria uma coluna CHAR(1) com uma espécie de protocolo: A - atualizar tabela 1 com dados da tabela 2
Re: RES: [oracle_br] Triggers de replicação.
Colega, sendo ou não sistema fechado, o que é errado é errado, no way, triggers absolutamente NÂO SÃO recomendáveis pra replicação, MONTES de efeitos colaterais possíveis 9sendo essa questão de disparo recursivo UM deles), se vc quer fazer algo direito nas condições atuais AO MENOS alguma mudança na aplicação (criação de objetos como update materialized view, alteração de colunas, criação de sinônimos, uso de API, o que for) vc TEM QUE ter Quanto à pergunta, não, não há nenhuma maneira nativa - vc em tese vc até poderia instrumentar a aplicação para que além de fazer o INSERT na tabela remota sinalizasse isso em algum lugar (arquivo, tabela, o que for) acessível ao outro banco, mas NOVAMENTE caímos na tecla de alteração de aplicação... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Eduardo [EMAIL PROTECTED] escreveu Jlchiappa, Concordo plenamente com vc que e uma logica errada. Mas e que o sistema e fechado e ja tentei brigar com os desenvolvedores unificar isso, mas sem sucesso ainda. Vou analisar tudo que vc falou e pensar em alguma coisa, mas vai ter que ser on-line, a diferenca ai e que nao vou ter DELETE, somente INSERT E UPDATE nas duas tabelas. Essa ideia do Fernando p/ identificar se vem da trigger o pedido de INSERT E UPDATE acho que resolveria,a droga é que não posso mexer na estrutura dessas tabelas. Será que tem alguma forma nativa de saber se o pedido DML´s vem da trigger ? edu... - Original Message - From: jlchiappa To: oracle_br@yahoogrupos.com.br Sent: Wednesday, May 23, 2007 1:41 PM Subject: Re: RES: [oracle_br] Triggers de replicação. Bota complexo nisso, Fernandes Eduardo, pra vc entender, pense por exemplo no seguinte caso, ao mesmo tempo o banco A pede um update na tabela e o banco B pede um delete, COMO que vc vai permitir que ambos executem são coisas EXCLUDENTES, vc não pode updatear o que está sendo deletado, é óbvio... Conflitos desse tipo é o que torna replicação onde ambos os lados podem fazer DMLs algo muuuito complexo - a tua abordagem de triggers é realmente, completamente ilógica, veja só : o banco A tem um trigger de INSERT na tabela T que faz insert na tabela T do banco B, E no banco B temos trigger que faz INSERT no A - ora, quando alguém mandar um insert no banco A (digamos), a trigger disparou e enviou um comando INSERT no B, ocorre que B recebendo o insert a trigger de insert dispara , que manda um INSERT no A, trigger do A dispara , manda INSERT no B, trigger N dispara Sacou a MONSTRUOSIDADE que vc tem feita aí ??? Só podia MESMO dar errado, vc tem em mãos uma lógica SEM A MENOR lógica... Bem, já que vc está escrevendo algo eu SUPONHO que : - vc tem dblink entre os bancos (óbvio) - hoje as duas tabelas são EXATAMENTE iguais - e que as features de replicação nativas do banco (inclusive replicação master/master) não podem ser usadas por algum motivo OBS : E vc diz que não pode ter uma tabela só (o que seria *** MESMO *** o mais fácil, eu tentaria MESMO batalhar por isso, mostre e explique pro teu cliente a complicação que é), vamos assumir que seja assim. .. Muito bem, nesse cenário de duas tabs, vc tem duas possibilidades principais, SERIALIZAÇÃO e ROTINA DE ATUALIZAÇÂO. Serialização seria algo do tipo : o dono das tabelas NÃO DÁ grants de INSERT/UPDATE/DELETE pra ninguém, ao invés da GRANT de execute em APIs (rotinas PL/SQL) apropriadas (uma pra INSERT, outra pra UPDATE e outra pra DELETE, digamos), e nessas rotinas antes de executar o DML vc manda um SELECT FROM tabela FOR UPDATE no registro da tabela local que está sendo alterado E um SELECT FROM [EMAIL PROTECTED] FOR UPDATE na tabela remota para esse mesmo registro, se conseguiu lockar ambos blz, vc manda o DML no registro local E no registro do bd remoto, se não conseguiu locar ambos os registros vc manda um erro pro usuário e manda o usuário pesquisar de novo daqui a pouco, trazendo assim a info refrescada, E refazer a operação passando os eventuais novos valores lidos pra API, e assim vai até conseguir. Já Atualização é a mais complexa, é o que outros colegas sugeriram, seria vc ter algum tipo de LOG das operações (numa outra tabela, num arquivo, via FLAG, o que for), log esse sequencial e disponível a AMBOS os bancos, que a cada período (no fim do dia, talvez) seria aplicado com a aplicação OFFLINE. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, FERNANDES Marco A SOFTTEK mfernandes@ escreveu Eduardo, seu caso é bem crítico... duas tabelas iguais, as duas online, as duas recebem comandos INS, DEL, UPD... complicado. E ainda não pode unificar ! piorou ! Uma coisa é certa ! trigger fazendo atualização cruzada não vai funcionar mesmo !!! sem dúvida ! O ideal seria centralizar
Re: RES: [oracle_br] Triggers de replicação.
Amigos... Obrigado pelas explicações, vou tentar fazer o correto mesmo... valeu mesmo... - Original Message - From: jlchiappa To: oracle_br@yahoogrupos.com.br Sent: Wednesday, May 23, 2007 2:28 PM Subject: Re: RES: [oracle_br] Triggers de replicação. Colega, sendo ou não sistema fechado, o que é errado é errado, no way, triggers absolutamente NÂO SÃO recomendáveis pra replicação, MONTES de efeitos colaterais possíveis 9sendo essa questão de disparo recursivo UM deles), se vc quer fazer algo direito nas condições atuais AO MENOS alguma mudança na aplicação (criação de objetos como update materialized view, alteração de colunas, criação de sinônimos, uso de API, o que for) vc TEM QUE ter Quanto à pergunta, não, não há nenhuma maneira nativa - vc em tese vc até poderia instrumentar a aplicação para que além de fazer o INSERT na tabela remota sinalizasse isso em algum lugar (arquivo, tabela, o que for) acessível ao outro banco, mas NOVAMENTE caímos na tecla de alteração de aplicação... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Eduardo [EMAIL PROTECTED] escreveu Jlchiappa, Concordo plenamente com vc que e uma logica errada. Mas e que o sistema e fechado e ja tentei brigar com os desenvolvedores unificar isso, mas sem sucesso ainda. Vou analisar tudo que vc falou e pensar em alguma coisa, mas vai ter que ser on-line, a diferenca ai e que nao vou ter DELETE, somente INSERT E UPDATE nas duas tabelas. Essa ideia do Fernando p/ identificar se vem da trigger o pedido de INSERT E UPDATE acho que resolveria,a droga é que não posso mexer na estrutura dessas tabelas. Será que tem alguma forma nativa de saber se o pedido DML´s vem da trigger ? edu... - Original Message - From: jlchiappa To: oracle_br@yahoogrupos.com.br Sent: Wednesday, May 23, 2007 1:41 PM Subject: Re: RES: [oracle_br] Triggers de replicação. Bota complexo nisso, Fernandes Eduardo, pra vc entender, pense por exemplo no seguinte caso, ao mesmo tempo o banco A pede um update na tabela e o banco B pede um delete, COMO que vc vai permitir que ambos executem são coisas EXCLUDENTES, vc não pode updatear o que está sendo deletado, é óbvio... Conflitos desse tipo é o que torna replicação onde ambos os lados podem fazer DMLs algo muuuito complexo - a tua abordagem de triggers é realmente, completamente ilógica, veja só : o banco A tem um trigger de INSERT na tabela T que faz insert na tabela T do banco B, E no banco B temos trigger que faz INSERT no A - ora, quando alguém mandar um insert no banco A (digamos), a trigger disparou e enviou um comando INSERT no B, ocorre que B recebendo o insert a trigger de insert dispara , que manda um INSERT no A, trigger do A dispara , manda INSERT no B, trigger N dispara Sacou a MONSTRUOSIDADE que vc tem feita aí ??? Só podia MESMO dar errado, vc tem em mãos uma lógica SEM A MENOR lógica... Bem, já que vc está escrevendo algo eu SUPONHO que : - vc tem dblink entre os bancos (óbvio) - hoje as duas tabelas são EXATAMENTE iguais - e que as features de replicação nativas do banco (inclusive replicação master/master) não podem ser usadas por algum motivo OBS : E vc diz que não pode ter uma tabela só (o que seria *** MESMO *** o mais fácil, eu tentaria MESMO batalhar por isso, mostre e explique pro teu cliente a complicação que é), vamos assumir que seja assim. .. Muito bem, nesse cenário de duas tabs, vc tem duas possibilidades principais, SERIALIZAÇÃO e ROTINA DE ATUALIZAÇÂO. Serialização seria algo do tipo : o dono das tabelas NÃO DÁ grants de INSERT/UPDATE/DELETE pra ninguém, ao invés da GRANT de execute em APIs (rotinas PL/SQL) apropriadas (uma pra INSERT, outra pra UPDATE e outra pra DELETE, digamos), e nessas rotinas antes de executar o DML vc manda um SELECT FROM tabela FOR UPDATE no registro da tabela local que está sendo alterado E um SELECT FROM [EMAIL PROTECTED] FOR UPDATE na tabela remota para esse mesmo registro, se conseguiu lockar ambos blz, vc manda o DML no registro local E no registro do bd remoto, se não conseguiu locar ambos os registros vc manda um erro pro usuário e manda o usuário pesquisar de novo daqui a pouco, trazendo assim a info refrescada, E refazer a operação passando os eventuais novos valores lidos pra API, e assim vai até conseguir. Já Atualização é a mais complexa, é o que outros colegas sugeriram, seria vc ter algum tipo de LOG das operações (numa outra tabela, num arquivo, via FLAG, o que for), log esse sequencial e disponível a AMBOS os bancos, que a cada período (no fim do dia, talvez) seria aplicado com a aplicação OFFLINE. []s Chiappa --- Em oracle_br
RES: RES: [oracle_br] Triggers de rep licação.
Voce não pode fazer o inverso , porque entra em loop Evento insert - Tabela1 para insere na Tabela 2 , se tiver um trigger Tabela 2 para inserir na Tabela 1 , entra em loop . Você tem fazer um controle uma tabela temporária , ou uma variável de package , para avisar Para não replicar o trigger se a origem do insert foi de um trigger da outra tabela , somente replicar se o insert foi de aplicação . Espero ter ajudado . Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? André Luiz Machado Tecnologia/Sistemas (51) 3341-9955 www.shoppingbrasil.com.br http://www.shoppingbrasil.com.br/ _ De: Eduardo [mailto:[EMAIL PROTECTED] Enviada em: quarta-feira, 23 de maio de 2007 10:55 Para: oracle_br@yahoogrupos.com.br Assunto: Re: RES: [oracle_br] Triggers de replicação. É que é uma tabela de clientes, e tenho que ter as duas identicas nas duas instancias diferentes e não há a possibilidade de ter uma unica tabela. - Original Message - From: Celso Henrique Souza To: [EMAIL PROTECTED] mailto:oracle_br%40yahoogrupos.com.br os.com.br Sent: Wednesday, May 23, 2007 9:00 AM Subject: Res: RES: [oracle_br] Triggers de replicação. tente inativar a trigger Celso Henrique O. Souza - Mensagem original De: Fabio Santos [EMAIL PROTECTED] mailto:santos%40brassites.com.br com.br Para: [EMAIL PROTECTED] mailto:oracle_br%40yahoogrupos.com.br os.com.br Enviadas: Terça-feira, 22 de Maio de 2007 19:36:03 Assunto: RES: [oracle_br] Triggers de replicação. pelo o que entendi, vc quer manter sempre duas tabelas iguais. se elas serao sempre as duas iguais, porque existir as duas e nao apenas uma? -Mensagem original- De: [EMAIL PROTECTED] mailto:oracle_br%40yahoogrupos.com.br os.com.br [mailto:[EMAIL PROTECTED] mailto:oracle_br%40yahoogrupos.com.br os.com.br] Em nome de Eduardo Enviada em: terça-feira, 22 de maio de 2007 17:40 Para: [EMAIL PROTECTED] mailto:oracle_br%40yahoogrupos.com.br os.com.br Assunto: [oracle_br] Triggers de replicação. Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] Apostilas » Dicas e Exemplos » Funções » Mundo Oracle » Package » Procedure » Scripts » Tutoriais acesse: http://www.oraclebr http://www.oraclebr.com.br/codigo/ListaCodigo.php .com.br/codigo/ListaCodigo.php -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail- http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ archive.com/oracle_br@yahoogrupos.com.br/ -- O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr http://www.oraclebr.com.br/ .com.br/ -- Links do Yahoo! Grupos __ Fale com seus amigos de graça com o novo Yahoo! Messenger http://br.messenger http://br.messenger.yahoo.com/ .yahoo.com/ [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
Re: RES: [oracle_br] Triggers de replicação.
É que é uma tabela de clientes, e tenho que ter as duas identicas nas duas instancias diferentes e não há a possibilidade de ter uma unica tabela. - Original Message - From: Celso Henrique Souza To: oracle_br@yahoogrupos.com.br Sent: Wednesday, May 23, 2007 9:00 AM Subject: Res: RES: [oracle_br] Triggers de replicação. tente inativar a trigger Celso Henrique O. Souza - Mensagem original De: Fabio Santos [EMAIL PROTECTED] Para: oracle_br@yahoogrupos.com.br Enviadas: Terça-feira, 22 de Maio de 2007 19:36:03 Assunto: RES: [oracle_br] Triggers de replicação. pelo o que entendi, vc quer manter sempre duas tabelas iguais. se elas serao sempre as duas iguais, porque existir as duas e nao apenas uma? -Mensagem original- De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de Eduardo Enviada em: terça-feira, 22 de maio de 2007 17:40 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Triggers de replicação. Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] Apostilas » Dicas e Exemplos » Funções » Mundo Oracle » Package » Procedure » Scripts » Tutoriais acesse: http://www.oraclebr.com.br/codigo/ListaCodigo.php -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ -- Links do Yahoo! Grupos __ Fale com seus amigos de graça com o novo Yahoo! Messenger http://br.messenger.yahoo.com/ [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
[oracle_br] Triggers de replicação.
Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] Triggers de replicação.
ou entao transformar a trigger em procedure e agendar no banco. :) On 5/22/07, Eduardo de Paula [EMAIL PROTECTED] wrote: Não seria mais simples criar uma view? On 5/22/07, Eduardo [EMAIL PROTECTED] wrote: Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] -- Os erros podem ser transformados em acertos quando com eles se aprende. Não existe a segurança do acerto eterno. -- Os erros podem ser transformados em acertos quando com eles se aprende. Não existe a segurança do acerto eterno. [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] Triggers de replicação.
Não seria mais simples criar uma view? On 5/22/07, Eduardo [EMAIL PROTECTED] wrote: Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] -- Os erros podem ser transformados em acertos quando com eles se aprende. Não existe a segurança do acerto eterno. [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] Triggers de replicação.
na verdade são tabelas de bases diferentes, entao realmente tudo que tiver em uma tem que ter na outra e fazer o inverso acontecer quando tiver um insert,update e delete. Acho q uma view nao resolve. o q acha ? Eduardo Souza Pinho Gerente - T.I / Sistemas DDR: 55 11 2146-9449 Fone: 55 11 2146-9444 Fax: 55 11 3871-3730 [EMAIL PROTECTED] www.sonsun.com.br - Original Message - From: Eduardo de Paula To: oracle_br@yahoogrupos.com.br Sent: Tuesday, May 22, 2007 5:39 PM Subject: Re: [oracle_br] Triggers de replicação. ou entao transformar a trigger em procedure e agendar no banco. :) On 5/22/07, Eduardo de Paula [EMAIL PROTECTED] wrote: Não seria mais simples criar uma view? On 5/22/07, Eduardo [EMAIL PROTECTED] wrote: Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] -- Os erros podem ser transformados em acertos quando com eles se aprende. Não existe a segurança do acerto eterno. -- Os erros podem ser transformados em acertos quando com eles se aprende. Não existe a segurança do acerto eterno. [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
RES: [oracle_br] Triggers de replicação.
depende do seu conceito. passe exatamente o que voce quer para ver o que pode ser feito. -Mensagem original- De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de Eduardo Enviada em: terça-feira, 22 de maio de 2007 17:40 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Triggers de replicação. Olá galera, Tenho 1 triggers q replica dados de uma tabela p/ outra. Tipo tabela1 p/ tabela2. Tenho q fazer o inverso agora, mas trava tudo. Com certeza é pq uma trigger dispara a outra. Como resolvo isso ? Aguarda a ajuda dos amigos... Edu... [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] Triggers
Fabiano, eu não conheço. Mas pode ser feito através de script facilmente. Veja exemplo: [EMAIL PROTECTED] select trigger_name, table_name, status 2from user_triggers 3 where table_name is not null 4 / TRIGGER_NAME TABLE_NAME STATUS -- -- T3_FER_BI T3 ENABLED T2_FER_BI T2 ENABLED T1_FER_BI T1 ENABLED 3 rows selected. [EMAIL PROTECTED] [EMAIL PROTECTED] begin 2 for x in ( select table_name 3 from user_triggers 4 where table_name is not null ) 5 loop 6 execute immediate 'alter table '|| x.table_name ||' disable all triggers'; 7 end loop; 8 end; 9 / PL/SQL procedure successfully completed. [EMAIL PROTECTED] [EMAIL PROTECTED] select trigger_name, table_name, status 2from user_triggers 3 where table_name is not null 4 / TRIGGER_NAME TABLE_NAME STATUS -- -- T3_FER_BI T3 DISABLED T2_FER_BI T2 DISABLED T1_FER_BI T1 DISABLED 3 rows selected. [EMAIL PROTECTED] [EMAIL PROTECTED] begin 2 for x in ( select table_name 3 from user_triggers 4 where table_name is not null ) 5 loop 6 execute immediate 'alter table '|| x.table_name ||' enable all triggers'; 7 end loop; 8 end; 9 / PL/SQL procedure successfully completed. [EMAIL PROTECTED] [EMAIL PROTECTED] [EMAIL PROTECTED] select trigger_name, table_name, status 2from user_triggers 3 where table_name is not null 4 / TRIGGER_NAME TABLE_NAME STATUS -- -- T3_FER_BI T3 ENABLED T2_FER_BI T2 ENABLED T1_FER_BI T1 ENABLED 3 rows selected. On 3/16/06, Fabiano P. [EMAIL PROTECTED] wrote: Este comando desabilita somente as triggers de uma tabela espefica, para desabilitar todas as triggres sem precisar passar por todas as tabelas nao tem como? Obrigado Fabiano P. Obrigado Fabiano P. On 3/15/06, Marcio Portes [EMAIL PROTECTED] wrote: alter table nome_table disable all triggers; On 3/15/06, Fabiano P. [EMAIL PROTECTED] wrote: Boa Tarde Existe algum comando que eu possa desabilitar todas as triggers ou o gerenciador delas? Atenciosamente -- Fabiano P. [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --__ Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine __ Links do Yahoo! Grupos -- Marcio Portes Material Tecnico em Portugues - http://mportes.blogspot.com Practical Learning Oracle - http://mportes.blogspot.com/2006/02/practical-learning-oracle.html [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --__ Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine __ *Yahoo! Grupos, um serviço oferecido por:* PUBLICIDADE
[oracle_br] Triggers
Boa Tarde Existe algum comando que eu possa desabilitar todas as triggers ou o gerenciador delas? Atenciosamente -- Fabiano P. [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --__ Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine __ Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ * Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html
Re: [oracle_br] Triggers
alter table nome_table disable all triggers; On 3/15/06, Fabiano P. [EMAIL PROTECTED] wrote: Boa Tarde Existe algum comando que eu possa desabilitar todas as triggers ou o gerenciador delas? Atenciosamente -- Fabiano P. [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --__ Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine __ Links do Yahoo! Grupos -- Marcio Portes Material Tecnico em Portugues - http://mportes.blogspot.com Practical Learning Oracle - http://mportes.blogspot.com/2006/02/practical-learning-oracle.html [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --__ Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine __ Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ * Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html