Oracle两表同步的触发器写法

sql语句如下:

select * from BDC_XMNDZFW;
 
select * from BDC_XMNDZFW_MX;
 
----复制备份表(若果想要备份的功能,可令条件为1=1
Create Table BDC_XMNDZFW_Backup As select * from BDC_XMNDZFW Where 1=2;
Create Table BDC_XMNDZFW_MX_Backup As select * from BDC_XMNDZFW_MX Where 1=2;
 
--创建操作日志表
Drop Table ChgLogTab;
 
create Table ChgLogTab
(
       TableName Varchar2(32),
       ForeignKey Varchar2(50),
       MainKey Varchar2(36),
       DMLType Varchar2(8),
       DMLTime DATE,
       PersonName VARCHAR2(30),
       ProgramExe VARCHAR2(64),
       HostMachine Varchar2(64),
       IpAddr CHAR(15)
);
 
 
Select * from ChgLogTab;
Delete From ChgLogTab;
------------------------------------------------------------------
---不授权给用户,触发器就没法看到这张表
sys as sysdba;
grant select on V_$SESSION to BDCDJ_ZF;
------------------------------------------------------------------
 
--------无效的主机名绑定变量:解决方案,Values的参数列表中缺少一个分隔符(,)
Create or Replace Trigger Tri_BDC_XMNDZFW
Before insert or delete or update on BDC_XMNDZFW for each row
Declare
TabName Varchar2(32);
ForeignKey Varchar2(50);
MainKey Varchar2(36);
DMLType Varchar2(8);
PersonName VARCHAR2(30);
ProgramExe VARCHAR2(64);
HostMachine VARCHAR2(64);
IpAddr CHAR(15);
DMLTime Date;
strTable Varchar(32);
strSql Varchar(1024);
Begin
      TabName := 'BDC_XMNDZFW';
      strTable := TabName||'_Backup';
      ForeignKey := null;
      MainKey := null;
      select username into PersonName from v$session where audsid = userenv('sessionid');
      select program into ProgramExe from v$session where audsid = userenv('sessionid');
      select machine into HostMachine from v$session where audsid = userenv('sessionid');
      select sys_context('userenv','ip_address') into IpAddr from v$session where audsid = userenv('sessionid');
      select sysdate into DMLTime from dual;
      --select username into PersonName,program into ProgramExe,machine into HostMachine,sys_context('userenv','ip_address') into IpAddr,sysdate into DMLTime from v$session where audsid = userenv('sessionid');
      if inserting then
         ForeignKey := :new.XMNDZFWID; 
         DMLType := '新增';
         strSql := 'Insert Into '||strTable||'(XMNDZFWID,CJR,XGSJ,XGR,BZ,FT,XMMC,TDXZ,XMDZZT,CFZT,DYZT,YYZT,YGZT,DYQZT,BAZT,BLZT,CQZT,XZQDM,ZDDM,BDCDYH,FDZL,TDSYQR,DYTDMJ,FTTDMJ,TDKSSYRQ,TDJSSYRQ,CJSJ,FWYT,FWXZ,YTQX,GLQY,SFHBCF,QLRZJBH) Values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27,:28,:29,:30,:31,:32,:33)'; 
         execute immediate  strSql Using :new.XMNDZFWID,:new.CJR,:new.XGSJ,:new.XGR,:new.BZ,:new.FT,:new.XMMC,:new.TDXZ,:new.XMDZZT,:new.CFZT,:new.DYZT,:new.YYZT,:new.YGZT,:new.DYQZT,:new.BAZT,:new.BLZT,:new.CQZT,:new.XZQDM,:new.ZDDM,:new.BDCDYH,:new.FDZL,:new.TDSYQR,:new.DYTDMJ,:new.FTTDMJ,:new.TDKSSYRQ,:new.TDJSSYRQ,:new.CJSJ,:new.FWYT,:new.FWXZ,:new.YTQX,:new.GLQY,:new.SFHBCF,:new.QLRZJBH; 
      elsif deleting then
         ForeignKey := :old.XMNDZFWID;
         DMLType := '删除';
         strSql := 'Insert Into '||strTable||'(XMNDZFWID,CJR,XGSJ,XGR,BZ,FT,XMMC,TDXZ,XMDZZT,CFZT,DYZT,YYZT,YGZT,DYQZT,BAZT,BLZT,CQZT,XZQDM,ZDDM,BDCDYH,FDZL,TDSYQR,DYTDMJ,FTTDMJ,TDKSSYRQ,TDJSSYRQ,CJSJ,FWYT,FWXZ,YTQX,GLQY,SFHBCF,QLRZJBH) Values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27,:28,:29,:30,:31,:32,:33)'; 
         execute immediate  strSql Using :old.XMNDZFWID,:old.CJR,:old.XGSJ,:old.XGR,:old.BZ,:old.FT,:old.XMMC,:old.TDXZ,:old.XMDZZT,:old.CFZT,:old.DYZT,:old.YYZT,:old.YGZT,:old.DYQZT,:old.BAZT,:old.BLZT,:old.CQZT,:old.XZQDM,:old.ZDDM,:old.BDCDYH,:old.FDZL,:old.TDSYQR,:old.DYTDMJ,:old.FTTDMJ,:old.TDKSSYRQ,:old.TDJSSYRQ,:old.CJSJ,:old.FWYT,:old.FWXZ,:old.YTQX,:old.GLQY,:old.SFHBCF,:old.QLRZJBH; 
      elsif updating then
         ForeignKey := :old.XMNDZFWID;
         DMLType := '更新';
         strSql := 'Insert Into '||strTable||'(XMNDZFWID,CJR,XGSJ,XGR,BZ,FT,XMMC,TDXZ,XMDZZT,CFZT,DYZT,YYZT,YGZT,DYQZT,BAZT,BLZT,CQZT,XZQDM,ZDDM,BDCDYH,FDZL,TDSYQR,DYTDMJ,FTTDMJ,TDKSSYRQ,TDJSSYRQ,CJSJ,FWYT,FWXZ,YTQX,GLQY,SFHBCF,QLRZJBH) Values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27,:28,:29,:30,:31,:32,:33)'; 
         execute immediate  strSql Using :old.XMNDZFWID,:old.CJR,:old.XGSJ,:old.XGR,:old.BZ,:old.FT,:old.XMMC,:old.TDXZ,:old.XMDZZT,:old.CFZT,:old.DYZT,:old.YYZT,:old.YGZT,:old.DYQZT,:old.BAZT,:old.BLZT,:old.CQZT,:old.XZQDM,:old.ZDDM,:old.BDCDYH,:old.FDZL,:old.TDSYQR,:old.DYTDMJ,:old.FTTDMJ,:old.TDKSSYRQ,:old.TDJSSYRQ,:old.CJSJ,:old.FWYT,:old.FWXZ,:old.YTQX,:old.GLQY,:old.SFHBCF,:old.QLRZJBH; 
      end if;  
      strSql := 'Insert Into ChgLogTab(TableName, ForeignKey, MainKey, DMLType, DMLTime, PersonName, ProgramExe, HostMachine, IpAddr) Values(:1, :2, :3, :4, :5, :6, :7, :8, :9)';
      execute immediate  strSql Using TabName, ForeignKey, MainKey, DMLType, DMLTime, PersonName, ProgramExe, HostMachine, IpAddr;
End;
 
--------------------------------------------------测试代码
delete from BDC_XMNDZFW where XMNDZFWID = 'ZJD00000000848';
update BDC_XMNDZFW set CJR = 'DogCat' Where XMNDZFWID = 'ZJD00000000849';
select * from BDC_XMNDZFW_Backup;
-----操作表
Select * from ChgLogTab order by DMLTime;
delete from BDC_XMNDZFW_MX where XMNDZFWID = 'ZJD00000000833' and MXID = 'CF00000002074';---Delete only one
delete from BDC_XMNDZFW_MX where XMNDZFWID = 'ZJD00000000871';---Delete many
update BDC_XMNDZFW_MX set ZCS = '5' where XMNDZFWID = 'ZJD00000000818'
select * from BDC_XMNDZFW_MX_Backup;
 
Create or Replace Trigger Tri_BDC_XMNDZFW_MX
Before insert or delete or update on BDC_XMNDZFW_MX for each row
Declare
TabName Varchar2(32);
ForeignKey Varchar2(50);
MainKey Varchar2(36);
DMLType Varchar2(8);
PersonName VARCHAR2(30);
ProgramExe VARCHAR2(64);
HostMachine VARCHAR2(64);
IpAddr CHAR(15);
DMLTime Date;
strTable Varchar(32);
strSql Varchar(1024);
Begin
      TabName := 'BDC_XMNDZFW_MX';
      strTable := TabName||'_Backup';
      ForeignKey := null;
      MainKey := null;
      select username into PersonName from v$session where audsid = userenv('sessionid');
      select program into ProgramExe from v$session where audsid = userenv('sessionid');
      select machine into HostMachine from v$session where audsid = userenv('sessionid');
      select sys_context('userenv','ip_address') into IpAddr from v$session where audsid = userenv('sessionid');
      select sysdate into DMLTime from dual;
      --select username into PersonName,program into ProgramExe,machine into HostMachine,sys_context('userenv','ip_address') into IpAddr,sysdate into DMLTime from v$session where audsid = userenv('sessionid');
      if inserting then
         ForeignKey := :new.XMNDZFWID; 
         MainKey := :new.MXID;
         DMLType := '新增';
         strSql := 'Insert Into '||strTable||'(XMNDZFWID,MXID,ZCS,GHYT,FWJG,ZH,XMMC,CFZT,DYQZT,YGZT,YYZT,DYZT,CQZT,BAZT,BLZT,BZ,XGR,XGSJ,CJR,CJSJ,ZTS,JGSJ,JZMJ,GLQY,JZWMC,ZRZID,BDCDYH) Values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27)'; 
         execute immediate  strSql Using :new.XMNDZFWID,:new.MXID,:new.ZCS,:new.GHYT,:new.FWJG,:new.ZH,:new.XMMC,:new.CFZT,:new.DYQZT,:new.YGZT,:new.YYZT,:new.DYZT,:new.CQZT,:new.BAZT,:new.BLZT,:new.BZ,:new.XGR,:new.XGSJ,:new.CJR,:new.CJSJ,:new.ZTS,:new.JGSJ,:new.JZMJ,:new.GLQY,:new.JZWMC,:new.ZRZID,:new.BDCDYH; 
      elsif deleting then
         ForeignKey := :old.XMNDZFWID;
         MainKey := :old.MXID;
         DMLType := '删除';
         strSql := 'Insert Into '||strTable||'(XMNDZFWID,MXID,ZCS,GHYT,FWJG,ZH,XMMC,CFZT,DYQZT,YGZT,YYZT,DYZT,CQZT,BAZT,BLZT,BZ,XGR,XGSJ,CJR,CJSJ,ZTS,JGSJ,JZMJ,GLQY,JZWMC,ZRZID,BDCDYH) Values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27)'; 
         execute immediate  strSql Using :old.XMNDZFWID,:old.MXID,:old.ZCS,:old.GHYT,:old.FWJG,:old.ZH,:old.XMMC,:old.CFZT,:old.DYQZT,:old.YGZT,:old.YYZT,:old.DYZT,:old.CQZT,:old.BAZT,:old.BLZT,:old.BZ,:old.XGR,:old.XGSJ,:old.CJR,:old.CJSJ,:old.ZTS,:old.JGSJ,:old.JZMJ,:old.GLQY,:old.JZWMC,:old.ZRZID,:old.BDCDYH; 
      elsif updating then
         ForeignKey := :old.XMNDZFWID;
         MainKey := :old.MXID;
         DMLType := '更新';
         strSql := 'Insert Into '||strTable||'(XMNDZFWID,MXID,ZCS,GHYT,FWJG,ZH,XMMC,CFZT,DYQZT,YGZT,YYZT,DYZT,CQZT,BAZT,BLZT,BZ,XGR,XGSJ,CJR,CJSJ,ZTS,JGSJ,JZMJ,GLQY,JZWMC,ZRZID,BDCDYH) Values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27)'; 
         execute immediate  strSql Using :old.XMNDZFWID,:old.MXID,:old.ZCS,:old.GHYT,:old.FWJG,:old.ZH,:old.XMMC,:old.CFZT,:old.DYQZT,:old.YGZT,:old.YYZT,:old.DYZT,:old.CQZT,:old.BAZT,:old.BLZT,:old.BZ,:old.XGR,:old.XGSJ,:old.CJR,:old.CJSJ,:old.ZTS,:old.JGSJ,:old.JZMJ,:old.GLQY,:old.JZWMC,:old.ZRZID,:old.BDCDYH; 
      end if;  
      strSql := 'Insert Into ChgLogTab(TableName, ForeignKey, MainKey, DMLType, DMLTime, PersonName, ProgramExe, HostMachine, IpAddr) Values(:1, :2, :3, :4, :5, :6, :7, :8, :9)';
      execute immediate  strSql Using TabName, ForeignKey, MainKey, DMLType, DMLTime, PersonName, ProgramExe, HostMachine, IpAddr;
End;
 

猜你喜欢

转载自blog.csdn.net/CherishPrecious/article/details/81281889