你真的懂得觸發器麼 數據及時同步更新成績分析。本站提示廣大學習愛好者:(你真的懂得觸發器麼 數據及時同步更新成績分析)文章只能為提供參考,不一定能成為您想要的結果。以下是你真的懂得觸發器麼 數據及時同步更新成績分析正文
當我們想更新一張靜態表的時刻(即:表中的數據赓續的添加),或許我們會用數據庫署理,經由過程寫功課,然後讓他准時查詢靜態表中最新添加的數據,然後更新數據。如許時能完成更新數據的請求,然則數據卻不克不及及時同步更新。
這個時刻,觸發器就是我們想要的神器了。我們可以在那張靜態表上新建觸發器。觸發器的本質就是個存儲進程,只不外他挪用的時光是依據所建的靜態表產生該表而履行(即:Insert新數據,Update或許Delete數據)。
詳細怎樣應用觸發器,明天我這裡就不引見了,園子裡材料多的很。那末我明天要引見的是甚麼呢?
頭幾天在寫sql代碼的時刻有意間發明了這麼個成績:就是我一向認為每當靜態表中拔出一條數據,觸發器就履行一次,然則我如許懂得的話,當批量拔出數據的時刻,觸發器履行的次數和拔出的行數雷同,然則現實不是如許。乘著明天有點時光,就想寫出來和年夜家分享下,講的纰謬請年夜家示正!
上面,我就寫了個簡略的例子供年夜家參考。
--我們要建觸發器的靜態表
Create table Table_a
(
ID int identity(1,1),--自增ID
Content nvarchar(50),
UpdateIDForTrigger int
)
然後我們在該表上創立一個觸發器
Create TRIGGER [dbo].[Table_a_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的值作為變量賦值
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_Info(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
deallocate 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等操作的時刻才履行的。它的對象不是針關於修正的行數(即:每行修正的時刻履行)。