SQL Server insert的觸發器


SQL Server insert的觸發器

一張表a根據一列(唯一鍵或主鍵)a1當插入數據時判斷該列a1的開頭的字符是否為:'0150'
若是則更新該表a的a2列為:'-10'

a表

CREATE TABLE a(
a1 nvarchar(50) NULL,
a2 int NULL
)

 


select * from a
truncate table a

 

該觸發器一次只能插入一行

create trigger tri_insert_a
on a
after insert
as
begin
if (select a.a1 from a, inserted
where a.a1 = inserted.a1 and a.a1) like '0150%'
begin
update a set a2='-10'
from a, inserted
where a.a1 = inserted.a1
and a.a1 like '0150%'
end
end

 

drop trigger tri_insert_a

 

一次插入多行
create trigger tri_insert_a
on a
after insert
as
begin
if exists(select a.a1 from a, inserted
where a.a1 = inserted.a1 and a.a1 like '0150%')
begin
update a set a2='-10'
from a, inserted
where a.a1 = inserted.a1
and a.a1 like '0150%'
end
end


drop trigger tri_insert_a

select * from a

 

修改觸發器
alter trigger tri_insert_a
on a
after insert
as
begin
if exists(select a.a1 from a, inserted
where a.a1 = inserted.a1 and a.a1
like '0150%')
begin
update a set a2='-10'
from a, inserted
where a.a1 = inserted.a1
and a.a1 like '0150%'
end
end


創建觸發器語法
create trigger trigger_name
on {table_name|view_name}
{After|Instead of} {insert|update|delete}
as 相應T-SQL語句

其中關於觸發器有時會遇到for替代after的情況,for 和 after 沒有區別。
for 不是before,sqlserver只有instead和after兩種觸發器。默認是after的。
for 不是同步,也不是BEFORE,是觸發器默認的觸發點,默認為AFTER,能用就用AFTER,
因為for 的話要編譯轉換一下后變成after,
所以for 比after 效率低一點點吧


還有經常遇到 insert table_a select * from table_b 這樣的語句,
同時在表table_a中根據每一條新增的SQL語句,通過觸發器來觸發對應的一系列的后續操作.
分析:
實際上insert觸發器,在每次SQL語句中只會影響到第一條的語句
如果觸發器被啟用,觸發器對每個批處理執行一次。
觸發器是針對一個事務而言,而不是根據數據記錄來做觸發的。
inserted,deleted是可以當作是臨時表,但不是一條記錄的臨時表,而是批處理的臨時表(一個事務的臨時表)

 

參考文檔:

關於MSDN《了解 DML 觸發器》
http://blog.csdn.net/jinjazz/article/details/3420299


SQL Server:觸發器詳解
http://www.cnblogs.com/rainman/p/3675834.html


SQL Server 觸發器
http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html


【SQL Server】SQL觸發器經驗詳解
http://jingyan.baidu.com/article/77b8dc7f2b82416175eab65b.html


可遇不可求的Question之SQLSERVER觸發器不支持多行插入操作篇
http://www.cnblogs.com/tigerjacky/p/1987913.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM