資料同步之各網站同步表觸發器建立,資料同步觸發器
在前一個部落格中提到了在資料同步的時候,在各網站需要建立各動作表的觸發器,在執行增刪改的時候,觸發器的任務是將其中操作的sql語句拼接成字串,並儲存在表synchro_tb_operate_log中,如果觸發器執行出現異常,則將其異常資訊儲存在另一個表中:SYNCHRO_DATA_EXCEP_LOG,其中
synchro_tb_operate_log欄位資訊:主鍵ID、拼接的sql語句(其中包含主鍵ID和地區代碼)、是否完成同步(預設為0未完成)、建立時間
SYNCHRO_DATA_EXCEP_LOG欄位資訊:主鍵ID、觸發器異常名稱、觸發器異常資訊、觸發器異常出現的時間
下面是建立item_rec代碼,也可以讓我們來學習一下建立觸發器相關的文法和知識:
create or replaceTRIGGER "ADMIN"."TRIGGER_ITEM_REC" after insert or update or delete on ITEM_REC FOR EACH ROW/** HEAD * @name 項目記錄表觸發器 * @description 變更事件,形成ddl語句插入同步表中 * @version 1.0.0 * @author Tang * @create-date 2014-07-01 */declare v_sql nvarchar2(3000); --臨時存放sql v_zdcode varchar2(30):='08052'; --站台碼 v_exception varchar2(500);begin v_sql := null; case when inserting then--插入資料 v_sql := 'insert into ITEM_REC('|| 'ID,PROTEAMNAME,PY,PROID,'|| 'JCTYPE,WORKFLAG,ZXFLAG,JWDCODE)'|| 'values('''|| :new.ID||''','''||replace(:new.PROTEAMNAME,'''','')||''','''||:new.PY||''','''||:new.PROID||''','''|| :new.JCTYPE||''','''||:new.WORKFLAG||''','''||:new.ZXFLAG||''','''||v_jwdcode||''')'; when updating then--更新資料 v_sql := 'update ITEM_REC set '|| 'PROTEAMNAME='''||replace(:new.PROTEAMNAME,'''','')||''''|| ',PY='''||:new.PY||''''|| ',PROID='''||:new.PROID||''''|| ',JCTYPE='''||:new.JCTYPE||''''|| ',WORKFLAG='''||:new.WORKFLAG||''''|| ',ZXFLAG='''||:new.ZXFLAG||''''|| ' where '|| 'ID='||:old.ID||' and JWDCODE='''||v_jwdcode||''''; when deleting then--刪除資料 v_sql := 'delete from ITEM_REC t where t.ID='||:old.ID||' and t.JWDCODE='''||v_jwdcode||''''; end case; if v_sql is not null then--如果v_sql不為空白,則將相應資訊插入到synchro_tb_operate_log表中 insert into synchro_tb_operate_log(sd_record_id,sd_record_sql,sd_flag,create_time) values(SEQ_SYNCHRO_DATA.NEXTVAL,v_sql,0,to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')); end if;exception when others then--如果執行過程中出現異常,則將異常資訊插入到SYNCHRO_DATA_EXCEP_LOG表中 v_exception := substr(sqlcode||'---'||sqlerrm, 1, 500); insert into SYNCHRO_DATA_EXCEP_LOG (ID,TRIGGER_NAME,EXCEPTION_INFO,EXCEPTION_TIME) values (sys_guid(),'Trigger_DICT_PROTEAM',v_exception,to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));end TRIGGER_ITEM_REC;
跨庫觸發器表同步時update資料同步怎實現?
什麼地方不懂?
1 不懂觸發器原理以及工作過程?
2 不懂那個例子?
不懂原理跟過程的話baidu一下會有很多,隨便一本將資料庫的書都會提到,不再贅述.這個例子可能是有點長,我給你翻譯一下吧
==================================
CREATE trigger [資料庫A.tr_user] on [user]
/* 建立觸發器的基本文法 在資料庫A的user表建立一個名字tr_user的觸發器 */
for update,insert,delete
/*監視 修改 插入 刪除*/
as
alter table 資料庫B..[user] DISABLE TRIGGER [資料庫B.tr_user]
/* 修改這個表的時候就不要做觸發了,disable掉 */
-----------------------------------
if not exists (select * from deleted) --插入
/* 如果deleted表為空白,那麼 */
insert 資料庫B..[user](username,userpass,landtime) select username,password,lastlogin from inserted
/* 將inserted表(就是對於觸發器來說剛剛被插入的集合)插入到B.user */
else if not exists (select * from inserted)--刪除
/* 否則 如果 inserted集合為空白 */
delete 資料庫B..[user] where id in (select userid from deleted)
/* 那麼刪除B.user下id是deleted集合中出現的id 這裡用了in */
else--更新
update [user]
set
[user].username=i.username,
[user].userpass=i.password
from 資料庫B..[user] as [user],
inserted as i
where [user].id=i.userid
/* update就很明顯了,凡是updated的都來更新,保持一樣就可以了 */
alter table 資料庫B..[user] ENABLE TRIGGER [資料庫B.tr_user]
這裡用了一個技巧,根據inserted集合以及deleted集合來判斷當前是插入或者刪除,然後如果是插入的,那麼另一個表刪除,刪除的另一個表插入.更新最簡單.(可能是用來兩個表互相交換資料,跟你的目的不一樣)
如果你覺得難以理解,單獨來建立三個觸發器, insert delete update也行,這樣就能減少一些判斷.比如insert
你可以先刪除 bbb ccc裡面id in inserted的(為了防止重複),然後再全部insert進去.
不知道你為什麼要這麼做,感覺意義不大.明顯的冗餘啊.如果是想保留資料,那麼定期添加一個計劃任務來用Data Transmission Service多好... 再說備份也是很好用的.
希望我理解沒有錯誤...餘下全文>>
SQL server2000 怎寫 觸發器 兩表資料同步
create trigger Mytrg
on table1
for insert
as
begin
insert into tabe2 select * from inserted
end
觸發器本身的工作原理就是一條一條的處理,插入1條自動處理1次,一次批插入N條,觸發器處理N次
for insert 觸發器的工作原理:
DBMS在資料進行插入的時候,每插入一條記錄後觸發觸發器,將插入的所有資料儲存在inserted暫存資料表中,
以上範例中:insert into tabe2 select * from inserted就是將inserted暫存資料表中的資料插入到tabe2表中,
此次觸發器執行完畢,系統自動刪除inserted表.如果批插入多條,將再次出發此觸發器
基本要求:tabe2 表結構和table1表結構一模一樣