資料同步之各網站同步表觸發器建立,資料同步觸發器

來源:互聯網
上載者:User

資料同步之各網站同步表觸發器建立,資料同步觸發器

     在前一個部落格中提到了在資料同步的時候,在各網站需要建立各動作表的觸發器,在執行增刪改的時候,觸發器的任務是將其中操作的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表結構一模一樣
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.