国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

你真的了解觸發器么 數據實時同步更新問題剖析

2024-08-31 00:44:23
字體:
來源:轉載
供稿:網友
當我們想更新一張動態表的時候(即:表中的數據不斷的添加),也許我們會用數據庫代理,通過寫作業,然后讓他定時查詢動態表中最新添加的數據,然后更新數據。這樣時能實現更新數據的要求,但是數據卻不能實時同步更新。

這個時候,觸發器就是我們想要的神器了。我們可以在那張動態表上新建觸發器。觸發器的實質就是個存儲過程,只不過他調用的時間是根據所建的動態表發生該表而執行(即: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


查詢結果如圖:

有經驗的朋友會知道,這個錯誤是由于多個結果用“=”賦值給一個變量導致的。
即: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


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

復制代碼 代碼如下:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灵山县| 乌兰察布市| 和田市| 德江县| 醴陵市| 武功县| 新乡县| 宁明县| 台中市| 岳普湖县| 精河县| 工布江达县| 绿春县| 广水市| 淮北市| 图片| 霍林郭勒市| 雅安市| 都兰县| 循化| 临汾市| 和静县| 谢通门县| 绍兴市| 阳原县| 阿坝| 崇州市| 宁乡县| 昌吉市| 乌鲁木齐县| 昂仁县| 张家口市| 永仁县| 洪雅县| 栖霞市| 长垣县| 塘沽区| 扶绥县| 河北省| 略阳县| 高雄市|