- Este tópico contém 9 respostas, 4 vozes e foi atualizado pela última vez 15 anos, 1 mês atrás por
leandrolbs.
-
AutorPosts
-
19 de janeiro de 2011 às 3:06 pm #97793
Doug
ParticipanteBom 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 – jr19 de janeiro de 2011 às 4:17 pm #97796burga
ParticipanteDá 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…
19 de janeiro de 2011 às 4:26 pm #97798Doug
ParticipanteIsso burga…vc tem algum exemplo de trigger pq o insert acho bem tranquilo mas o update e o delete..to rachando a “cuca”….
19 de janeiro de 2011 às 4:56 pm #97804fsitja
ParticipanteEssa tabela BB não poderia ser uma materialized view com fast refresh?
19 de janeiro de 2011 às 4:57 pm #97805leandrolbs
Participantea tabela possui chaves?, coloque a estrutura dela…. e monto a base da trigger …
19 de janeiro de 2011 às 5:08 pm #97806Doug
ParticipanteValeu 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) YKEYS
FUN_PK FUN_ID
FUN_UK USER_UNF_ID,CD_FUNCIONARIO19 de janeiro de 2011 às 9:09 pm #97822leandrolbs
ParticipanteCara, 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
[]’s19 de janeiro de 2011 às 9:30 pm #97826Doug
ParticipanteCaracas 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
19 de janeiro de 2011 às 10:50 pm #97837burga
ParticipanteTomando 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 ROWBEGIN
--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… 🙄
20 de janeiro de 2011 às 12:14 am #97850leandrolbs
Participantecom 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.
-
AutorPosts
- Você deve fazer login para responder a este tópico.