Pular para o conteúdo
  • Este tópico contém 9 respostas, 4 vozes e foi atualizado pela última vez 15 anos, 1 mês atrás por leandrolbs.
Visualizando 10 posts - 1 até 10 (de 10 do total)
  • Autor
    Posts
  • #97793
    Doug
    Participante

      Bom dia pessoal.

      Tenho o seguinte b.o para resolver.

      Dentro do meu bd tenho 2 aplicacoes com users diferentes.

      O schema A possui a table AA. O schema B possuiu a table BB.

      Toda vez que ocorrer um insert, update e delete na tabela AA, a tabela BB deverá executar a mesma operação…ou seja a tabela BB sera um espelho da AA…consequentemente os 2 sistemas terao as mesmas
      informacoes….

      Alguma ideia de como fazer isso ? Alguem ja passou por essa situação ?

      abs

      Douglas
      DBA – jr

      #97796
      burga
      Participante

        Dá pra fazer via trigger… Ou ainda criar um sinônimo da tabela AA pro owner B, se as duas são exatamene iguais e possuem os mesmos dados…

        #97798
        Doug
        Participante

          Isso burga…vc tem algum exemplo de trigger pq o insert acho bem tranquilo mas o update e o delete..to rachando a “cuca”….

          #97804
          fsitja
          Participante

            Essa tabela BB não poderia ser uma materialized view com fast refresh?

            #97805
            leandrolbs
            Participante

              a tabela possui chaves?, coloque a estrutura dela…. e monto a base da trigger …

              #97806
              Doug
              Participante

                Valeu pela ajuda de todos.

                desc hw_funcionarios;

                Name Type Nullable Default Comments


                CRG_ID NUMBER(10) Y
                CD_FUNCIONARIO NUMBER(10)
                NO_FUNCIONARIO VARCHAR2(40)
                NO_ABREV_FUNC VARCHAR2(20) Y
                DT_ADMISSAO DATE Y
                DT_NASCIMENTO DATE Y
                NR_CCORRENTE VARCHAR2(15) Y
                SET_ID NUMBER(8) Y
                TP_ESCOLARIDADE NUMBER(1) Y
                TP_ENQUADRAMENTO NUMBER(2) Y
                VL_SALARIO NUMBER(10,2) Y
                NR_CPF NUMBER(11) Y
                NR_CI NUMBER(15) Y
                FUN_USER VARCHAR2(30)
                FUN_OSUSER VARCHAR2(30)
                STAMP DATE
                REG_ID NUMBER(8) Y
                FUN_ID NUMBER(8)
                DS_TELEFONE VARCHAR2(15) Y
                NR_COLETOR NUMBER(2) Y
                TP_FUNCIONARIO NUMBER(2) Y
                TP_SERVICO NUMBER(1) Y
                ERRO_COLETOR VARCHAR2(300) Y
                ATUAL_COLETOR DATE Y
                DS_EMAIL_1 VARCHAR2(50) Y
                DS_EMAIL_2 VARCHAR2(50) Y
                NR_CRACHA NUMBER(8) Y
                NR_TELEFONE_RESIDENCIAL NUMBER(11) Y
                NR_TELEFONE_CELULAR NUMBER(11) Y
                NR_TELEFONE_RECADO NUMBER(11) Y
                TP_ESTADO_CIVIL NUMBER(2) Y
                TP_STATUS_FUNCIONARIO NUMBER(2) Y
                DS_EPI_CALCADO VARCHAR2(3) Y
                DS_EPI_CAMISA NUMBER(1) Y
                MLC_ID NUMBER(8) Y
                LPA_ID NUMBER(8) Y
                DS_BANCO VARCHAR2(15) Y
                DS_AGENCIA VARCHAR2(15) Y
                NR_ENDERECO VARCHAR2(15) Y
                DS_HABILITACAO VARCHAR2(15) Y
                DT_HABILITACAO DATE Y
                NR_PIS NUMBER(12) Y
                NR_CTPS NUMBER(10) Y
                NR_SERIE_CTPS NUMBER(5) Y
                DS_UF VARCHAR2(2) Y
                DS_FATOR_SANGUINEO VARCHAR2(5) Y
                DS_CATEGORIA_HABILITACAO VARCHAR2(5) Y
                CRG_IPEM_ID NUMBER(8) Y
                VL_GRATIFICACAO NUMBER(17,2) Y
                VL_BONUS NUMBER(17,2) Y
                FUC_ID NUMBER(10) Y
                DT_DEMISSAO DATE Y
                AO_COLETOR NUMBER(1) Y
                NR_HORAS_MES VARCHAR2(6) Y
                VL_SALARIO_BASE NUMBER(17,2) Y
                VL_PERICULOSIDADE NUMBER(17,2) Y
                VL_INSALUBRIDADE NUMBER(17,2) Y
                VL_ADICIONAIS NUMBER(17,2) Y
                DT_VALIDADE_HABILITACAO DATE Y
                IM_ASSINATURA BLOB Y
                NR_ORDEM_SERV_HABILITACAO VARCHAR2(15) Y
                NR_CAD_PROFISSIONAL VARCHAR2(50) Y
                NR_IP_HOST VARCHAR2(40) Y
                NR_IP_NET VARCHAR2(40) Y
                DT_INSERT DATE Y
                NO_USER_INSERT VARCHAR2(30) Y
                VL_ABONO_PERMANENTE NUMBER(17,2) Y
                USER_UNF_ID NUMBER(8)
                VL_ABONO_SALARIAL NUMBER(17,2) Y
                DS_SENHA_COLETOR VARCHAR2(8) Y
                VER_GRATIF_ID NUMBER(8) Y
                VL_PERCENTUAL_GRATIFICACAO2 NUMBER(3) Y
                VL_PERCENTUAL_ANUENIO NUMBER(2) Y
                DT_GRAT_INCORPORADA DATE Y
                DT_CHEFIA DATE Y
                AO_IPM_SAUDE VARCHAR2(1) Y
                AO_IPM_PREVIFOR VARCHAR2(1) Y
                VL_VANTAGEM_REAJUSTAVEL NUMBER(17,2) Y
                VL_GRATIFICACAO_NS NUMBER(17,2) Y
                VL_VANTAGEM_AUTONOMA NUMBER(17,2) Y
                VL_COMPLEMENTO NUMBER(17,2) Y
                AO_BRESSER VARCHAR2(1) Y
                VL_AUX_REFEICAO NUMBER(17,2) Y
                VL_ANUENIO NUMBER(17,2) Y
                VL_BRESSER NUMBER(17,2) Y
                VL_ARTIGO_469 NUMBER(17,2) Y
                AO_ARTIGO_469 VARCHAR2(1) Y
                AO_GRATIFICACAO_NS VARCHAR2(1) Y
                AO_PERICULOSIDADE NUMBER(1) Y
                NO_MAE VARCHAR2(40) Y
                NO_PAI VARCHAR2(40) Y
                TP_AGENTE NUMBER(1) Y
                VL_BASE_GRATIF NUMBER(17,2) Y
                VL_BRESSER_COMPL NUMBER(17,4) Y
                VL_PERC_ADIANT_13 NUMBER(3) Y
                VL_GRATIFICACAO2 NUMBER(17,2) Y
                VL_BASE NUMBER(17,2) Y

                KEYS

                FUN_PK FUN_ID
                FUN_UK USER_UNF_ID,CD_FUNCIONARIO

                #97822
                leandrolbs
                Participante

                  Cara, tá testado… só monte da tabela inteira pq tem muito campo…rs

                  --tabela
                  create table hw_funcionarios(
                  FUN_ID NUMBER,
                  DS_TELEFONE VARCHAR2(15),
                  NR_COLETOR NUMBER(2),
                  TP_FUNCIONARIO NUMBER(2),
                  TP_SERVICO NUMBER(1),
                  ERRO_COLETOR VARCHAR2(300),
                  ATUAL_COLETOR DATE,
                  DS_EMAIL_1 VARCHAR2(50),
                  DS_EMAIL_2 VARCHAR2(50));

                  create table hw_funcionarios_LADOB(
                  FUN_ID NUMBER,
                  DS_TELEFONE VARCHAR2(15),
                  NR_COLETOR NUMBER(2),
                  TP_FUNCIONARIO NUMBER(2),
                  TP_SERVICO NUMBER(1),
                  ERRO_COLETOR VARCHAR2(300),
                  ATUAL_COLETOR DATE,
                  DS_EMAIL_1 VARCHAR2(50),
                  DS_EMAIL_2 VARCHAR2(50));

                  alter table HW_FUNCIONARIOS add constraint FUN_PK primary key (FUN_ID);
                  alter table HW_FUNCIONARIOS_LADOB add constraint FUNB_PK primary key (FUN_ID);

                  CREATE OR REPLACE TRIGGER TG_AIUD_HW_FUNCIONARIOS AFTER INSERT OR UPDATE OR DELETE ON HW_FUNCIONARIOS FOR EACH ROW

                  DECLARE
                  TIPO CHAR(1);

                  BEGIN
                  IF INSERTING THEN
                  TIPO := 'I';
                  ELSIF UPDATING THEN
                  TIPO := 'U';
                  ELSIF DELETING THEN
                  TIPO := 'D';
                  END IF;
                  --CASO SEJA INSERT
                  IF (TIPO = 'I') THEN
                  insert into hw_funcionarios_ladob
                  (fun_id,
                  ds_telefone,
                  nr_coletor,
                  tp_funcionario,
                  tp_servico,
                  erro_coletor,
                  atual_coletor,
                  ds_email_1,
                  ds_email_2)
                  values
                  (:NEW.fun_id,
                  :NEW.ds_telefone,
                  :NEW.nr_coletor,
                  :NEW.tp_funcionario,
                  :NEW.tp_servico,
                  :NEW.erro_coletor,
                  :NEW.atual_coletor,
                  :NEW.ds_email_1,
                  :NEW.ds_email_2);
                  END IF;
                  --CASO ESTEJA ATUALIZANDO
                  IF (TIPO = 'U') THEN
                  update hw_funcionarios_ladob
                  set ds_telefone = :NEW.ds_telefone,
                  nr_coletor =:NEW.nr_coletor,
                  tp_funcionario = :NEW.tp_funcionario,
                  tp_servico = :NEW.tp_servico,
                  erro_coletor = :NEW.erro_coletor,
                  atual_coletor = :NEW.atual_coletor,
                  ds_email_1 =:NEW.ds_email_1,
                  ds_email_2 = :NEW.ds_email_2
                  where fun_id = :old.fun_id;
                  END IF;
                  --CASO ESTEJA REMOVENDO
                  IF (TIPO = 'D') THEN
                  delete hw_funcionarios_ladob where fun_id = :OLD.fun_id;
                  END IF;
                  END;

                  insert into hw_funcionarios
                  (fun_id, ds_telefone, nr_coletor, tp_funcionario, tp_servico, erro_coletor, atual_coletor, ds_email_1, ds_email_2)
                  values
                  (1,'56654',1,1,1,'b','19/01/2011','eu@eu.com.be','eu@eu.com.br');
                  --ok
                  select * from jr.hw_funcionarios_ladob;
                  --ok
                  update hw_funcionarios
                  set ds_telefone = 11111111
                  where fun_id = 1;
                  --ok
                  select * from jr.hw_funcionarios_ladob;
                  --ok
                  delete from hw_funcionarios;
                  --ok
                  select * from jr.hw_funcionarios_ladob;
                  --ok

                  Tá ai, criei duas tabelinhas, e 1 trigger que trabalha nas condições do dml, se fosse da tua cidade iria pedir uma coca gelada.kkkk
                  []’s

                  #97826
                  Doug
                  Participante

                    Caracas brother…eu iria te pagar um engradado de coca cola…rsrs…vou testar aqui…ja estou ate subindo um backup de ontem na maquina de testes…

                    Muito Obrigado…

                    Que Deus possa estar sempre abençoando sua vida…

                    abs

                    #97837
                    burga
                    Participante

                      Tomando a liberdade de modificar um pouco o código do Leandro, da pra fazer de forma direta, sem utilizar a variável TIPO:

                      CREATE OR REPLACE TRIGGER TG_AIUD_HW_FUNCIONARIOS AFTER INSERT OR UPDATE OR DELETE ON HW_FUNCIONARIOS FOR EACH ROW

                      BEGIN

                      --CASO SEJA INSERT
                      IF INSERTING THEN
                      insert into hw_funcionarios_ladob (
                      fun_id,
                      ds_telefone,
                      nr_coletor,
                      tp_funcionario,
                      tp_servico,
                      erro_coletor,
                      atual_coletor,
                      ds_email_1,
                      ds_email_2)
                      values (
                      :NEW.fun_id,
                      :NEW.ds_telefone,
                      :NEW.nr_coletor,
                      :NEW.tp_funcionario,
                      :NEW.tp_servico,
                      :NEW.erro_coletor,
                      :NEW.atual_coletor,
                      :NEW.ds_email_1,
                      :NEW.ds_email_2);
                      --CASO ESTEJA ATUALIZANDO
                      ELSIF UPDATING THEN
                      update hw_funcionarios_ladob
                      set ds_telefone = :NEW.ds_telefone,
                      nr_coletor =:NEW.nr_coletor,
                      tp_funcionario = :NEW.tp_funcionario,
                      tp_servico = :NEW.tp_servico,
                      erro_coletor = :NEW.erro_coletor,
                      atual_coletor = :NEW.atual_coletor,
                      ds_email_1 =:NEW.ds_email_1,
                      ds_email_2 = :NEW.ds_email_2
                      where fun_id = :old.fun_id;
                      --CASO ESTEJA REMOVENDO
                      ELSIF DELETING THEN
                      delete hw_funcionarios_ladob where fun_id = :OLD.fun_id;
                      END IF;
                      END;
                      /

                      Dessa forma o banco vai realizar algumas comparações a menos… 🙄

                      #97850
                      leandrolbs
                      Participante

                        com certeza burga, mais já trato a trigger desta forma para implementação pratica dentro de um trigger com tabela de log de alterações, sendo assim fica mais pratico. costume. obrigado.

                      Visualizando 10 posts - 1 até 10 (de 10 do total)
                      • Você deve fazer login para responder a este tópico.