設(shè)計(jì)DML觸發(fā)器的注意事項(xiàng)及技巧
在了解觸發(fā)器的種類和工作理由之后,現(xiàn)在可以開始動(dòng)手來(lái)設(shè)計(jì)觸發(fā)器了,不過(guò)在動(dòng)手之前,還有一些注意事項(xiàng)必須先了解一下:
設(shè)計(jì)觸發(fā)器的限制
在觸發(fā)器中,有一些SQL語(yǔ)句是不能使用的,這些語(yǔ)句包括:
表1 在DML觸發(fā)器中不能使用的語(yǔ)句
不能使用的語(yǔ)句 | 語(yǔ)句功能 |
Alter Database | 修改數(shù)據(jù)庫(kù) |
Create Database | 新建數(shù)據(jù)庫(kù) |
Drop Database | 刪除數(shù)據(jù)庫(kù) |
Load Database | 導(dǎo)入數(shù)據(jù)庫(kù) |
Load Log | 導(dǎo)入日志 |
Reconfigure | 更新配置選項(xiàng) |
Restore Database | 還原數(shù)據(jù)庫(kù) |
Restore Log | 還原數(shù)據(jù)庫(kù)日志 |
另外,在對(duì)作為觸發(fā)操作的目標(biāo)的表或視圖使用了下面的SQL語(yǔ)句時(shí),不允許在DML觸發(fā)器里再使用這些語(yǔ)句:
表2 在目標(biāo)表中使用過(guò)的,DML觸發(fā)器不能再使用的語(yǔ)句
不能使用的語(yǔ)句 | 語(yǔ)句功能 |
Create Index | 建立索引 |
Alter Index | 修改索引 |
Drop Index | 刪除索引 |
DBCC Dbreindex | 重新生成索引 |
Alter Partition Function | 通過(guò)拆分或合并邊界值更改分區(qū) |
Drop Table | 刪除數(shù)據(jù)表 |
Alter Table | 修改數(shù)據(jù)表結(jié)構(gòu) |
如何在觸發(fā)器取得字段修改前和修改后的數(shù)據(jù)
上面介紹過(guò),SQL Server 2005在為每個(gè)觸發(fā)器都定義了兩個(gè)虛擬表,一個(gè)是插入表(inserted),一個(gè)是刪除表(deleted),現(xiàn)在把這兩個(gè)表存放的數(shù)據(jù)列表說(shuō)明一下:
表11.3 插入/刪除表的功能
激活觸發(fā)器的動(dòng)作 | Inserted表 | Deleted表 |
Insert | 存放要插入的記錄 | |
Update | 存放要更新的記錄 | 存放更新前的舊記錄 |
Delete | | 存放要?jiǎng)h除的舊記錄 |
以上面刪除庫(kù)存產(chǎn)品記錄為例,在刪除時(shí)觸發(fā)器要判斷庫(kù)存數(shù)量是否為零,那么判斷就應(yīng)該這么寫:
If (Select 庫(kù)存數(shù)量 From Deleted)>0
Begin
Print ‘庫(kù)存數(shù)量大于零時(shí)不能刪除此記錄’
Rollback Transaction
End
其他注意事項(xiàng)
l After觸發(fā)器只能用于數(shù)據(jù)表中,Instead Of觸發(fā)器可以用于數(shù)據(jù)表和視圖上,但兩種觸發(fā)器都不可以建立在臨時(shí)表上。
l 一個(gè)數(shù)據(jù)表可以有多個(gè)觸發(fā)器,但是一個(gè)觸發(fā)器只能對(duì)應(yīng)一個(gè)表。
l 在同一個(gè)數(shù)據(jù)表中,對(duì)每個(gè)操作(如Insert、Update、Delete)而言可以建立許多個(gè)After觸發(fā)器,但Instead Of觸發(fā)器針對(duì)每個(gè)操作只有建立一個(gè)。
l 如果針對(duì)某個(gè)操作即設(shè)置了After觸發(fā)器又設(shè)置了Instead Of觸發(fā)器,那么Instead of觸發(fā)器一定會(huì)激活,而After觸發(fā)器就不一定會(huì)激活了。
l Truncate Table語(yǔ)句雖然類似于Delete語(yǔ)句可以刪除記錄,但是它不能激活Delete類型的觸發(fā)器。因?yàn)?/span>Truncate Table語(yǔ)句是不記入日志的。
l WRITETEXT語(yǔ)句不能觸發(fā)Insert和Update型的觸發(fā)器。
l 不同的SQL語(yǔ)句,可以觸發(fā)同一個(gè)觸發(fā)器,如Insert和Update語(yǔ)句都可以激活同一個(gè)觸發(fā)器。
聯(lián)系客服