sql server的觸發器在資料批量處理時,只會觸發一次觸發器,後面的操作觸發器全部失效,sql server執行語句並不是按行語句進行,所以在批量處理資料時,觸發器需要特殊處理。
處理方式1:
在觸發器內新建一張臨時表,將所有資料暫存在臨時表(建議加上乙個自增主鍵)中,迴圈臨時表來觸發觸發器。
下面是乙個demo,批量插入資料,判斷age是否大於150,若大於資料回滾。
use [blogdemo]
go/****** object: trigger [dbo].[trigger_insert] script date: 2019/5/29 10:52:10 ******/
set ansi_nulls on
goset quoted_identifier on
goalter trigger [dbo].[trigger_insert]
on [dbo].[person]
after insert
as begin
set nocount on;
--新建一張臨時表,並加入乙個自增主鍵id,便於後面的迴圈操作
create table #temp(id int identity(1,1) primary key, personid int,name varchar(50),age int, adddate datetime)
insert into #temp(personid, name, age, adddate)
select id, name, age, adddate from inserted
declare @i int=1,@is int=0
select @is =max([id]) from #temp
while @i
begin
declare @age int =0;
select @age=age from #temp where id=@i
if(@age<150)
begin
insert into personlog(personid, name, age, adddate)
select id, name, age, adddate from #temp where id=@i
endelse
begin
print('年齡應小於150')
rollback transaction
endset @i=@i+1;
endend
處理方式2:在觸發器內使用游標來迴圈資料觸發觸發器。同樣的demo如下:
use [blogdemo]
go/****** object: trigger [dbo].[trigger_insert] script date: 2019/5/29 10:52:10 ******/
set ansi_nulls on
goset quoted_identifier on
goalter trigger [dbo].[trigger_insert]
on [dbo].[person]
after insert
as begin
set nocount on;
--游標也可以實現行機觸發器
declare insert_cursor cursor forward_only static
for select id,name,age,adddate from inserted
open insert_cursor
declare @id int, @name varchar(50), @age int,@adddate datetime
fetch from insert_cursor into @id, @name, @age, @adddate
while @@fetch_status=0
begin
if(@age>150)
begin
print('年齡應小於150')
rollback transaction
endelse
insert into personlog(personid,name,age,adddate)
values
(@id, @name, @age, @adddate)
fetch next from insert_cursor into @id, @name, @age, @adddate
endclose insert_cursor
deallocate insert_cursor
end
demo測試資料圖: sqlserver觸發器複習
create table a a1 int,a2 int create table b b1 int,b2 int insert into a values 1,0 insert into b values 1,0 create trigger tri update a2 a on a for up...
SQL server 之 觸發器
今天對觸發器研究了一下,之前的學習感覺挺朦朧的,今天鼓搗了一天,算是有了一點點了解,把學習的體會記錄了下來。常見的觸發器 觸發器的作用 自動化操作,減少了手動操作以及出錯的機率 現實工作中用的比較少,因為想讓他執行起來效率高很難 一 dml觸發器 insert delete update 不支援se...
SQLSERVER的觸發器
觸發器的定義 觸發器是一種特殊型別的儲存過程,他不同於前面介紹過的一般的儲存過程 在sql內部把觸發器看做是儲存過程但是不能傳遞引數 一般的儲存過程通過儲存過程名稱被直接呼叫,而觸發器主要是通過事件進行觸發而被執行.總的來說,觸發器是一種功能強大的工具,在表中資料發生變化時自動強制執行,觸發器還可以...