1. 程式人生 > >SqlServer觸發器的一個例子

SqlServer觸發器的一個例子

先抄一點關於觸發器的文字介紹,後邊談我自己的例子:

在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程式。觸發器是一個特殊的儲存過程。
常見的有三種:分別應用於Insert , Update , Delete 事件。

一、Trigger語法:
create trigger tr_name
on table/view
{for | after | instead of } [update][,][insert][,][delete]
[with encryption]
as {batch | if update (col_name) [{and|or} update (col_name)] }

說明:
1 tr_name :名稱
2 on table/view :觸發器所作用的表。一個觸發器只能作用於一個表
3 for 和after :同義
4 after 與instead of :sql 2000新增專案afrer 與 instead of 的區別
After
在觸發事件發生以後才被啟用,只可以建立在表上
Instead of
代替了相應的觸發事件而被執行,既可以建立在表上也可以建立在檢視上
5 insert、update、delete:啟用觸發器的三種操作,可以同時執行,也可選其一
6 if update (col_name):表明所作的操作對指定列是否有影響,有影響,則啟用觸發器。此外,因為delete 操作只對行有影響,
所以如果使用delete操作就不能用這條語句了(雖然使用也不出錯,但是不能啟用觸發器,沒意義)。
7 觸發器執行時用到的兩個特殊表:deleted ,inserted
deleted 和inserted 可以說是一種特殊的臨時表,是在進行啟用觸發器時由系統自動生成的,其結構與觸發器作用的表結構是一
樣的,只是存放 的資料有差異。

下面談一點心得:
觸發器的使用有兩個關鍵點,一是觸發器的邏輯,即觸發器的設計問題,二是兩張臨時表deleted和inserted。
談談我寫的這個例子的背景,兩張表,一張為評價標準,存放的各種各樣的標準,權值,評分,一張為資料,我的工作是根據資料對照標準來進行評分。現在有一個很現實的問題,就是當標準的表被修改時,資料表要有相應的改動,我在這個問題上採用了觸發器。

USE [EvaluateSystem]
GO
Create trigger [dbo].[AddDataColumn]
on [dbo].[EvaluateHierarchy]
after insert
as
declare
@s varchar(50) declare @n int declare @sql NVARCHAR(539) begin select @s=TwoLevelStandard from inserted i select @n=COUNT(*) from EvaluateHierarchy where [email protected] if(@n=1) begin SET @sql = N'alter table [dbo].[EvaluateData] add '+ @s+ ' varchar(50) null' + N';' exec(@sql) end end

這個應該都能看懂,我說說自己覺得困難的地方
1.對於變數的使用,就是@s這裡,變數的賦值的方式是沒用過的(t-sql並不會)
2.要用exec來執行sql語句,我本意是把

alter table [dbo].[EvaluateData] add '+ @s+ ' varchar(50) null
這一句直接寫在這個觸發器中,等待順序執行,調了半天並沒有用,還一直報錯,後來發現要用exec來執行

3.exec執行動態sql語句時不能執行這種語句

exec('alter table [dbo].[EvaluateData] add '+ @s+ ' varchar(50) null' )
   但是可以執行這種語句(這個細節折磨了我半天)
exec(@sql)

4.觸發器的除錯,這個玩意因為是個後臺被動觸發,所以要執行相應的語句才能進入,即單步除錯(f10)一個插入語句,執行到insert時F11進入就可以了

貼一個連結,這篇帖子給我很大幫助[exec用法]

(http://www.cnblogs.com/12go/archive/2011/09/13/2174853.html)