国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Sql Server - 你真的了解觸發(fā)器么 數(shù)據(jù)實時同步更新問題剖析

你真的了解觸發(fā)器么 數(shù)據(jù)實時同步更新問題剖析

2019-12-29 16:05MSSQL教程網(wǎng) Sql Server

觸發(fā)器就是我們想要的神器了。我們可以在那張動態(tài)表上新建觸發(fā)器。觸發(fā)器的實質(zhì)就是個存儲過程,只不過他調(diào)用的時間是根據(jù)所建的動態(tài)表發(fā)生該表而執(zhí)行(即:Insert新數(shù)據(jù),Update或者Delete數(shù)據(jù))具體怎么使用觸發(fā)器,今天我這里

當(dāng)我們想更新一張動態(tài)表的時候(即:表中的數(shù)據(jù)不斷的添加),也許我們會用數(shù)據(jù)庫代理,通過寫作業(yè),然后讓他定時查詢動態(tài)表中最新添加的數(shù)據(jù),然后更新數(shù)據(jù)。這樣時能實現(xiàn)更新數(shù)據(jù)的要求,但是數(shù)據(jù)卻不能實時同步更新。 

這個時候,觸發(fā)器就是我們想要的神器了。我們可以在那張動態(tài)表上新建觸發(fā)器。觸發(fā)器的實質(zhì)就是個存儲過程,只不過他調(diào)用的時間是根據(jù)所建的動態(tài)表發(fā)生該表而執(zhí)行(即:Insert新數(shù)據(jù),Update或者Delete數(shù)據(jù))。 

具體怎么使用觸發(fā)器,今天我這里就不介紹了,園子里資料多的很。那么我今天要介紹的是什么呢? 
前幾天在寫sql代碼的時候無意間發(fā)現(xiàn)了這么個問題:就是我一直以為每當(dāng)動態(tài)表中插入一條數(shù)據(jù),觸發(fā)器就執(zhí)行一次,但是我這樣理解的話,當(dāng)批量插入數(shù)據(jù)的時候,觸發(fā)器執(zhí)行的次數(shù)和插入的行數(shù)相同,但是事實不是這樣。乘著今天有點時間,就想寫出來和大家分享下,講的不對請大家斧正! 

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

復(fù)制代碼代碼如下:


--我們要建觸發(fā)器的動態(tài)表 
Create table Table_a 

ID int identity(1,1),--自增ID 
Content nvarchar(50), 
UpdateIDForTrigger int 


然后我們在該表上創(chuàng)建一個觸發(fā)器 

復(fù)制代碼代碼如下:


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字段的值,為了能更明顯的看出實時執(zhí)行的效果 
UPDATE Table_a 
SET UpdateIDForTrigger = (@ID+10)--為了能看出不同,就直接將比ID大10的值作為變量賦值 
WHERE ID = @ID; 
END 


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

復(fù)制代碼代碼如下:


--給信息表添加數(shù)據(jù) 
insert into Table_a(Content) values('信息一'); 
insert into Table_a(Content) values('信息二'); 


然后查詢下現(xiàn)在動態(tài)表中的數(shù)據(jù)情況 

復(fù)制代碼代碼如下:


select * from Table_a 


查詢結(jié)果如圖: 
你真的了解觸發(fā)器么 數(shù)據(jù)實時同步更新問題剖析 
我們可以看到觸發(fā)器執(zhí)行了。在每條數(shù)據(jù)插入的時候觸發(fā)器同時執(zhí)行了Update功能。 
然后,我們要批量插入數(shù)據(jù),為了方便我們插入,我們這里建立一張臨時的基本信息表: 

復(fù)制代碼代碼如下:


--基本信息表 
Create table Table_Info 

ID int identity(1,1), 
Content nvarchar(50) 


然后插入數(shù)據(jù) 

復(fù)制代碼代碼如下:


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('信息十'); 


然后我們就可以批量插入數(shù)據(jù)到動態(tài)表中了 

復(fù)制代碼代碼如下:


insert into Table_a(Content) 
select Content from Table_Info 


這次重點來了,我們在執(zhí)行這個sql語句的時候消息框中會出現(xiàn)錯誤提示: 
你真的了解觸發(fā)器么 數(shù)據(jù)實時同步更新問題剖析 
有經(jīng)驗的朋友會知道,這個錯誤是由于多個結(jié)果用“=”賦值給一個變量導(dǎo)致的。 
即:set @變量=(select 多行結(jié)果 from Table) 
這個時候,我就疑惑了,問題出在哪里了呢?不是觸發(fā)器在每插一條數(shù)據(jù)的時候執(zhí)行一次么? 
于是,我將觸發(fā)器改了下: 

復(fù)制代碼代碼如下:


Alter TRIGGER [dbo].[Table_a_Ins] 
ON [dbo].[Table_a] 
AFTER INSERT 
AS 
BEGIN 
select ID from inserted; 
END 


然后再執(zhí)行上面的批量插入試試看,看看他inserted表中到底存的是什么值: 
果然不出所料,inserted表中的結(jié)果并不是一條數(shù)據(jù): 
你真的了解觸發(fā)器么 數(shù)據(jù)實時同步更新問題剖析
知道錯誤的原因,我們操作起來就簡單了,我們可以給inserted表建游標(biāo),然后通過游標(biāo)來對批量插入的每行數(shù)據(jù)進行編輯。下面是我們修改后的觸發(fā)器代碼: 

復(fù)制代碼代碼如下:


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 


然后,我們再按照上面的批量插入數(shù)據(jù),然后查詢下動態(tài)表中的結(jié)果: 

復(fù)制代碼代碼如下:


insert into Table_a(Content) 
select Content from Table_Info; 
select * from Table_a; 


此時運行沒有錯誤提示了,運行結(jié)果如下: 

你真的了解觸發(fā)器么 數(shù)據(jù)實時同步更新問題剖析 
這樣,批量插入插入數(shù)據(jù)時觸發(fā)器也能用了。 
然后結(jié)合了幾位前輩的建議,再改了下觸發(fā)器的代碼。將上面的游標(biāo)改成了下面的方式: 

復(fù)制代碼代碼如下:


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 


然后再批量插入了幾行數(shù)據(jù),結(jié)果也是可以的。所以學(xué)無止境啊!! 
你真的了解觸發(fā)器么 數(shù)據(jù)實時同步更新問題剖析 
總結(jié)下:觸發(fā)器運行是每次執(zhí)行一次Insert操作或者是Update,Delete等操作的時候才執(zhí)行的。它的對象不是針對于修改的行數(shù)(即:每行修改的時候執(zhí)行)。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品成人一区二区 | 欧美片网站免费 | t66y最新地址一地址二69 | 亚洲午夜在线 | 狠狠久 | 国产成人毛片 | 中文字幕视频在线观看 | 一级欧美| 欧美专区在线观看 | 亚洲综合影院 | 毛片黄片免费观看 | 久久激情视频 | 国产99久久精品一区二区永久免费 | 久久精品一区二区三区四区 | 欧美日在线 | av在线播放网 | 操操操干干干 | 日本在线一区 | 一级大片一级一大片 | 激情综合网五月婷婷 | 欧美精品一区二区久久婷婷 | 精品粉嫩超白一线天av | 国产精品色婷婷亚洲综合看 | 一区二区免费看 | 成人精品综合 | 免费在线成人网 | 91精品久久久久久综合五月天 | 久久久久久久久一区二区三区 | 亚洲三级免费观看 | 欧美黑人性生活 | 97精品久久 | 国内精品一区二区三区 | 国产久| 欧洲精品视频在线观看 | 亚洲一区二区三区 | 国产精品久久久久久久久久东京 | 欧美日韩成人在线观看 | 国产日韩一级片 | 欧美一级片毛片免费观看视频 | 三级黄色片在线观看 | 日日操操|