1、觸發(fā)器的 '本質(zhì)':
觸發(fā)器是一種特殊的存儲過程,它不能被顯式地調(diào)用,
而是在往表中插入記錄、更改記錄或者刪除記錄時,當事件發(fā)生時,才被
自動地激活。
2、這樣做帶來的 '功能':
觸發(fā)器可以用來對表實施復(fù)雜的完整性約束,保持數(shù)
據(jù)的一致性,當觸發(fā)器所保護的數(shù)據(jù)發(fā)生改變時,觸發(fā)器會自動被激活,
響應(yīng)同時執(zhí)行一定的操作(對其它相關(guān)表的操作),從而保證對數(shù)據(jù)的不完整
性約束或不正確的修改。
觸發(fā)器可以查詢其它表,同時也可以執(zhí)行復(fù)雜的T-SQL語句。觸發(fā)器和引
發(fā)觸發(fā)器執(zhí)行的命令被當作一次事務(wù)處理,因此就具備了事務(wù)的所有特征。
注意: '事務(wù)具備什么特征?在觸發(fā)器中的作用?'
如果發(fā)現(xiàn)引起觸發(fā)器執(zhí)行的T-SQL語句執(zhí)行了一個非法操作,比如關(guān)于其它表的
相關(guān)性操作,發(fā)現(xiàn)數(shù)據(jù)丟失或需調(diào)用的數(shù)據(jù)不存在,那么就回滾到該事件執(zhí)行
前的SQL SERVER數(shù)據(jù)庫狀態(tài)。
3、觸發(fā)器的作用:
觸發(fā)器可以對數(shù)據(jù)庫進行級聯(lián)修改,這一點剛才已經(jīng)說過了。
需要說明的是: '觸發(fā)器和約束的關(guān)系和區(qū)別'
(1)一般來說,使用約束比使用觸發(fā)器效率更高。
(2)同時,觸發(fā)器可以完成比CHECK約束更復(fù)雜的限制。
說明:
2.1 與CHECK約束不同,在觸發(fā)器中可以引用其它的表。
2.2 觸發(fā)器可以發(fā)現(xiàn)改變前后表中數(shù)據(jù)的不一致,并根據(jù)這些不同來進行相應(yīng)
的操作。
2.3 對于一個表不同的操作(INSERT、UPDATE、DELETE)可以采用不同的觸
發(fā)器,即使是對相同的語句也可以調(diào)用不同的觸發(fā)器來完成不同的操作。
舉例1:在簽訂一份訂單時,貨物的庫存量應(yīng)減少。
問?這應(yīng)用了觸發(fā)器的什么特征?CHECK約束能解決嗎?
舉例2:正在進行整理的貨物不能下訂單。
問?這應(yīng)用了觸發(fā)器的什么特征?CHECK約束能解決嗎?
1、觸發(fā)器的 '本質(zhì)':
觸發(fā)器是一種特殊的存儲過程,它不能被顯式地調(diào)用,
而是在往表中插入記錄、更改記錄或者刪除記錄時,當事件發(fā)生時,才被
自動地激活。
2、這樣做帶來的 '功能':
觸發(fā)器可以用來對表實施復(fù)雜的完整性約束,保持數(shù)
據(jù)的一致性,當觸發(fā)器所保護的數(shù)據(jù)發(fā)生改變時,觸發(fā)器會自動被激活,
響應(yīng)同時執(zhí)行一定的操作(對其它相關(guān)表的操作),從而保證對數(shù)據(jù)的不完整
性約束或不正確的修改。
觸發(fā)器可以查詢其它表,同時也可以執(zhí)行復(fù)雜的T-SQL語句。觸發(fā)器和引
發(fā)觸發(fā)器執(zhí)行的命令被當作一次事務(wù)處理,因此就具備了事務(wù)的所有特征。
注意: '事務(wù)具備什么特征?在觸發(fā)器中的作用?'
如果發(fā)現(xiàn)引起觸發(fā)器執(zhí)行的T-SQL語句執(zhí)行了一個非法操作,比如關(guān)于其它表的
相關(guān)性操作,發(fā)現(xiàn)數(shù)據(jù)丟失或需調(diào)用的數(shù)據(jù)不存在,那么就回滾到該事件執(zhí)行
前的SQL SERVER數(shù)據(jù)庫狀態(tài)。
3、觸發(fā)器的作用:
觸發(fā)器可以對數(shù)據(jù)庫進行級聯(lián)修改,這一點剛才已經(jīng)說過了。
需要說明的是: '觸發(fā)器和約束的關(guān)系和區(qū)別'
(1)一般來說,使用約束比使用觸發(fā)器效率更高。
(2)同時,觸發(fā)器可以完成比CHECK約束更復(fù)雜的限制。
說明:
2.1 與CHECK約束不同,在觸發(fā)器中可以引用其它的表。
2.2 觸發(fā)器可以發(fā)現(xiàn)改變前后表中數(shù)據(jù)的不一致,并根據(jù)這些不同來進行相應(yīng)
的操作。
2.3 對于一個表不同的操作(INSERT、UPDATE、DELETE)可以采用不同的觸
發(fā)器,即使是對相同的語句也可以調(diào)用不同的觸發(fā)器來完成不同的操作。
舉例1:在簽訂一份訂單時,貨物的庫存量應(yīng)減少。
問?這應(yīng)用了觸發(fā)器的什么特征?CHECK約束能解決嗎?
舉例2:正在進行整理的貨物不能下訂單。
問?這應(yīng)用了觸發(fā)器的什么特征?CHECK約束能解決嗎?
作業(yè)2:
在order_test表建立insert觸發(fā)器,當向order_test表插入一行,如果cust_test表中對應(yīng)
記錄status值為1,說明處于準備狀態(tài)不能寫入該數(shù)據(jù)。
|
圖形化操作觸發(fā)器
11.3 查看觸發(fā)器情況
圖形化操作結(jié)合T-SQL命令
(1)sp_helptrigger 觸發(fā)器名
查看觸發(fā)器的名稱,擁有者和五個布爾值
|
(2)sp_helptext 觸發(fā)器名
查看文本信息
(3)設(shè)置某一觸發(fā)器的無效和重新有效
|
(4)刪除觸發(fā)器
|
作業(yè)3:
在order_test表上建立一個插入觸發(fā)器,在添加一個訂單時,減少cust_test表的相應(yīng)貨物的記錄的庫存量。
作業(yè)4:
在order_test表上建立一個插入觸發(fā)器,規(guī)定訂單日期(Odate)不能手工修改。
作業(yè)5:
要求訂購的物品一定要在倉庫中有的,并且數(shù)量足夠
例6:
在order_test表上建立一個插入觸發(fā)器,同時插入多行數(shù)據(jù)時,要求訂購的物品一定要在倉庫中有的。
答案3:
|
答案4:
|
答案5:
|
答案6:
|
Transact-SQL 參考
SET ROWCOUNT
使 Microsoft? SQL Server? 在返回指定的行數(shù)之后停止處理查詢。
語法
|
參數(shù)
|
是在停止給定查詢之前要處理的行數(shù)(整數(shù))。
注釋
建議將當前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 語句重新編寫為使用 TOP 語法。有關(guān)更多信息,請參見 DELETE、INSERT 或 UPDATE。
對于在遠程表和本地及遠程分區(qū)視圖上執(zhí)行的 INSERT、UPDATE 和 DELETE 語句,忽略 SET ROWCOUNT 選項設(shè)置。
若要關(guān)閉該選項(以便返回所有的行),請將 SET ROWCOUNT 指定為 0。
說明 設(shè)置 SET ROWCOUNT 選項將使大多數(shù) Transact-SQL 語句在已受指定數(shù)目的行影響后停止處理。這包括觸發(fā)器和 INSERT、UPDATE 及 DELETE 等數(shù)據(jù)修改語句。ROWCOUNT 選項對動態(tài)游標無效,但限制鍵集的行集和不感知游標。使用該選項時應(yīng)謹慎,它主要與 SELECT 語句一起使用。
如果行數(shù)的值較小,則 SET ROWCOUNT 替代 SELECT 語句 TOP 關(guān)鍵字。
SET ROWCOUNT 的設(shè)置是在執(zhí)行或運行時設(shè)置,而不是在分析時設(shè)置。
權(quán)限
SET ROWCOUNT 權(quán)限默認授予所有用戶。
示例
SET ROWCOUNT 在指定的行數(shù)后停止處理。在下例中,注意有 x 行滿足預(yù)付款少于或等于 $5,000 的條件;但是,從更新所返回的行數(shù)中可以看出并非所有的行都得到處理。ROWCOUNT 影響所有的 Transact-SQL 語句。
|
下面是結(jié)果集:
|