你真的了解觸發器麼 資料實時同步更新問題剖析

2022-09-24 22:57:12 字數 3967 閱讀 4487

當我們想更新一張動態表的時候(即:表中的資料不斷的新增),也許我們會用資料庫**,通過寫作業,然後讓他定時查詢動態表中最新新增的資料,然後更新資料。這樣時能實現更新資料的要求,但是資料卻不能實時同步更新。

這個時候,觸發器就是我們想要的神器了。我們可以在那張動態表上新建觸發器。觸發器的實質就是個儲存過程,只不過他呼叫的時間是根據所建的動態表發生該錶而執行(即:insert新資料,update或者delete資料)。

具體怎麼使用觸發器,今天我這裡就不介紹了,園子裡資料多的很。那麼我今天要介紹的是什麼呢?

前幾天在寫sql**的時候無意間發現了這麼個問題:就是我一直以為每當動態表中插入一條資料,觸發器就執行一次,但是我這樣理解的話,當批量插入資料的時候,觸發器執行的次數和插入的行數相同,但是事實不是這樣。乘著今天有點時間,就想寫出來和大家分享下,講的不對請大家斧正!

下面,我就寫了個簡單的例子供大家參考。

複製** **如下:

--我們要建觸發器的動態表

create table table_a

( id int identity(1,1),--自增id

content nvarchar(50),

updateidfortr int )

然後我們在該錶上建立乙個觸發器

複製** **如下:

create trigger [dbo].[table_ahzydjb_ins]

on [dbo].[table_a]

after insert

as begin

declare @id int

set @id=(select id from inserted)

--更新table_a表中的updateidfortrigger欄位的值,為了能更明顯的看出實時執行的效果

update table_a

set updateidfortrigger = (@id+10)--為了能看出不同,就直接將比id大10的值hzydjb作為變數賦值

where id = @id;

end

接下來,我們按照普通一條條的插入結果測試下:

複製** **如下:

--給資訊表新增資料

insert into table_a(content) values('資訊一');

insert into table_a(content) values('資訊二');

然後查詢下現在動態表中的資料情況

複製** **如下:

select * from table_a

查詢結果如圖:

我們可以看到觸發器執行了。在每條資料插入的時候觸發器同時執行了update功能。

然後,我們要批量插入資料,為了方便我們插入,我們這裡建立一張臨時的基本資訊表:

複製** **如下:

--基本資訊表

create table table_info

( id int identity(1,1),

content nvarchar(50) )

然後插入資料

複製** **如下:

insert into table_info(content) values('資訊三');

insert into table_info(content) values('資訊四');

insert into table_info(content) values('資訊五');

insert into table_hzydjbinfo(content) values('資訊六');

insert into table_info(content) values('資訊七');

insert into table_info(content) values('資訊八');

insert into table_info(content) values('資訊九');

insert into table_info(content) values('資訊十');

然後我們就可以批量插入資料到動態表中了

複製** **如下:

insert into table_a(content)

select content from table_info

這次重點來了,我們在執行這個sql語句的時候訊息框中會出現錯誤提示:

有經驗的朋友會知道,這個錯誤是由於多個結果用「=」賦值給乙個變數導致的。

即:set @變數=(select 多行結果 from table)

這個時候,我就疑惑了,問題出在**了呢?不是觸發器在每插一條資料的時候執行一次麼?

於是,我將觸發器改了下:

複製** **如下:

alter trigger [dbo].[table_a_ins]

on [dbo].[table_a]

after insert

as begin

select id from inserted;

end

然後再執行上面的批量插入試試看,看看他inserted表中到底存的是什麼值:

果然不出所料,inserted表中的結果並不是一條資料:

知道錯誤的原因,我們操作起來就簡單了,我們可以給inserted表建游標,然後通過游標來對批量插入的每行資料進行編輯。下面是我們修改後的觸發器**:

複製** **如下:

alter trigger [dbo].[table_a_ins]

on [dbo].[table_a]

after insert

as begin

declare @id int

declare cur_insert cursor

for

select id from inserted

open cur_insert

fetch next from cur_insert into @id

while @@fetch_status=0

begin

update table_a

set updateidfortrigger = (@id+10)--為了能看出不同,就直接將比id大10的值作為變數賦值

where id = @id;

fetch next from cur_insert into @id

end

close cur_insert

deallocwww.cppcns.comate cur_insert

end

然後,我們再按照上面的批量插入資料,然後查詢下動態表中的結果:

複製** **如下:

insert into table_a(content)

select content from table_info;

select * from table_a;

此時執行沒有錯誤提示了,執行結果如下:

這樣,批量插入插入資料時觸發器也能用了。

然後結合了幾位前輩的建議,再改了下觸發器的**。將上面的游標改成了下面的方式:

複製** **如下:

alter trigger [dbo].[table_a_ins]

on [dbo].[table_a]

after insert

as begin

update table_a

set updateidfortrigger =inserted.id+10

from inserted

where table_a.id=inserted.id

end

然後再批量插入了幾行資料,結果也是可以的。所以學無止境啊!!

總結下:觸發器執行是每次執行一次insert操作或者是update,delete等操作的時候才執行的。它的物件不是針對於修改的行數(即:每行修改的時候執行)。

本文標題: 你真的了解觸發器麼 資料實時同步更新問題剖析

本文位址:

kettle利用觸發器實現資料同步

2016年8月17日 一 目的 通過觸發器實現資料同步 二 思路 1.在資料庫需要同步的源表中建立乙個insert觸發器,當有新資料插入時,會自動將新插入資料的主鍵記錄到臨時表temp中。當然也可以記錄多個字段 2.比較臨時表temp和源表中的資料,匹配兩個表中的主鍵值是否一致 也可以匹配多個字段 ...

MySQL觸發器實現表資料同步

其中old表示tab2 被動觸發 new表示tab1 主動觸發,外部應用程式在此表裡執行insert語句 1 插入 在乙個表裡新增一條記錄,另乙個表也新增一條記錄 drop table if exists tab1 create table tab1 tab1 id varchar 11 drop ...

觸發器在增量同步資料的運用

觸發器可以記錄對錶的新增,修改,刪除,這樣可以通過觸發器,記錄一段時間內的表的變動的記錄,把這些記錄存到乙個變動記錄表裡,資料同步的時候,就可以讀取這張變成的記錄表,只需要同步變動過的記錄,這樣可以大大提高同步的速度.對原表刪除的操作,可以能新錶做delete操作 對原表進行insert 或upda...