成人在线你懂的-成人在线免费小视频-成人在线免费网站-成人在线免费视频观看-日韩精品国产一区二区-日韩精品国产一区

掃一掃
關注微信公眾號

Sql Server觸發器的原理
2007-07-29   賽迪網

1、觸發器的 '本質':

觸發器是一種特殊的存儲過程,它不能被顯式地調用,

而是在往表中插入記錄、更改記錄或者刪除記錄時,當事件發生時,才被

自動地激活。

2、這樣做帶來的 '功能':

觸發器可以用來對表實施復雜的完整性約束,保持數

據的一致性,當觸發器所保護的數據發生改變時,觸發器會自動被激活,

響應同時執行一定的操作(對其它相關表的操作),從而保證對數據的不完整

性約束或不正確的修改。

觸發器可以查詢其它表,同時也可以執行復雜的T-SQL語句。觸發器和引

發觸發器執行的命令被當作一次事務處理,因此就具備了事務的所有特征。

注意: '事務具備什么特征?在觸發器中的作用?'

如果發現引起觸發器執行的T-SQL語句執行了一個非法操作,比如關于其它表的

相關性操作,發現數據丟失或需調用的數據不存在,那么就回滾到該事件執行

前的SQL SERVER數據庫狀態。

3、觸發器的作用:

觸發器可以對數據庫進行級聯修改,這一點剛才已經說過了。

需要說明的是: '觸發器和約束的關系和區別'

(1)一般來說,使用約束比使用觸發器效率更高。

(2)同時,觸發器可以完成比CHECK約束更復雜的限制。

說明:

2.1 與CHECK約束不同,在觸發器中可以引用其它的表。

2.2 觸發器可以發現改變前后表中數據的不一致,并根據這些不同來進行相應

的操作。

2.3 對于一個表不同的操作(INSERT、UPDATE、DELETE)可以采用不同的觸

發器,即使是對相同的語句也可以調用不同的觸發器來完成不同的操作。

舉例1:在簽訂一份訂單時,貨物的庫存量應減少。

問?這應用了觸發器的什么特征?CHECK約束能解決嗎?

舉例2:正在進行整理的貨物不能下訂單。

問?這應用了觸發器的什么特征?CHECK約束能解決嗎?

1、觸發器的 '本質':

觸發器是一種特殊的存儲過程,它不能被顯式地調用,

而是在往表中插入記錄、更改記錄或者刪除記錄時,當事件發生時,才被

自動地激活。

2、這樣做帶來的 '功能':

觸發器可以用來對表實施復雜的完整性約束,保持數

據的一致性,當觸發器所保護的數據發生改變時,觸發器會自動被激活,

響應同時執行一定的操作(對其它相關表的操作),從而保證對數據的不完整

性約束或不正確的修改。

觸發器可以查詢其它表,同時也可以執行復雜的T-SQL語句。觸發器和引

發觸發器執行的命令被當作一次事務處理,因此就具備了事務的所有特征。

注意: '事務具備什么特征?在觸發器中的作用?'

如果發現引起觸發器執行的T-SQL語句執行了一個非法操作,比如關于其它表的

相關性操作,發現數據丟失或需調用的數據不存在,那么就回滾到該事件執行

前的SQL SERVER數據庫狀態。

3、觸發器的作用:

觸發器可以對數據庫進行級聯修改,這一點剛才已經說過了。

需要說明的是: '觸發器和約束的關系和區別'

(1)一般來說,使用約束比使用觸發器效率更高。

(2)同時,觸發器可以完成比CHECK約束更復雜的限制。

說明:

2.1 與CHECK約束不同,在觸發器中可以引用其它的表。

2.2 觸發器可以發現改變前后表中數據的不一致,并根據這些不同來進行相應

的操作。

2.3 對于一個表不同的操作(INSERT、UPDATE、DELETE)可以采用不同的觸

發器,即使是對相同的語句也可以調用不同的觸發器來完成不同的操作。

舉例1:在簽訂一份訂單時,貨物的庫存量應減少。

問?這應用了觸發器的什么特征?CHECK約束能解決嗎?

舉例2:正在進行整理的貨物不能下訂單。

問?這應用了觸發器的什么特征?CHECK約束能解決嗎?

作業2:

在order_test表建立insert觸發器,當向order_test表插入一行,如果cust_test表中對應

記錄status值為1,說明處于準備狀態不能寫入該數據。

答案1:
use northwind
go
create trigger cust_orders_del1
on Cust_test
after delete
as 
delete from order_test
where CustomerID in
(select CustomerID from deleted)
go

答案2:
use northwind
go
create trigger cust_orders_ins2
on order_test
after insert
as
if (select cstatus from cust_test,inserted where 

cust_test.customerid=inserted.customerid)=1
begin
print 'The Goods is being processed'
rollback transaction
end
go

圖形化操作觸發器

11.3 查看觸發器情況

圖形化操作結合T-SQL命令

(1)sp_helptrigger 觸發器名

查看觸發器的名稱,擁有者和五個布爾值

supdate,isdelete,isinsert,isafter,isinsteadof

(2)sp_helptext 觸發器名

查看文本信息

(3)設置某一觸發器的無效和重新有效

無效:
use northwind
alter table 表名
disable trigger 觸發器名

重新有效:
use northwind
alter table 表名
enable trigger 觸發器名

(4)刪除觸發器

use northwind
drop trigger 觸發器名,觸發器名

作業3:

在order_test表上建立一個插入觸發器,在添加一個訂單時,減少cust_test表的相應貨物的記錄的庫存量。

作業4:

在order_test表上建立一個插入觸發器,規定訂單日期(Odate)不能手工修改。

作業5:

要求訂購的物品一定要在倉庫中有的,并且數量足夠

例6:

在order_test表上建立一個插入觸發器,同時插入多行數據時,要求訂購的物品一定要在倉庫中有的。

答案3:

use northwind
go 
create trigger cust_orders_ins3
on order_test
after insert
as 
update cust_test set cstorage=cstorage-inserted.orders
from cust_test,inserted
where cust_test.customerid=inserted.customerid

答案4:

use northwind
go
create trigger orderdateupdate
on order_test
after update
as
if update (odate)
begin
raiserror('Error',10,1)
rollback transaction
end

答案5:

use northwind
go
create trigger order_insert5
on order_test
after insert
as
begin
if(select count(*)
from cust_test,inserted
where cust_test.customerid=inserted.customerid)=0
begin
print 'No entry in goods for your order'
rollback transaction
end
if(select cust_test.cstorage from cust_test,inserted 
where cust_test.customerid=inserted.customerid)<
(select inserted.orders from cust_test,inserted 
where cust_test.customerid=inserted.customerid)
begin
print 'No enough entry in goods for your order'
rollback transaction
end
end

答案6:

use northwind
go
create trigger order_insert6
on order_test
after insert
as
if 
(select count(*) from cust_test,inserted
where cust_test.customerid=inserted.customerid)<>@@rowcount
--可以在觸發器邏輯中使用 @@ROWCOUNT 函數以區分單行插入和多行插入。
begin
delete order_test from order_test,inserted
where order_test.orderid=inserted.orderid and
inserted.customerid not in (select customerid from cust_test)
end

print @@rowcount

Transact-SQL 參考

SET ROWCOUNT

使 Microsoft? SQL Server? 在返回指定的行數之后停止處理查詢。

語法

SET ROWCOUNT { number | @number_var }

參數

number | @number_var

是在停止給定查詢之前要處理的行數(整數)。

注釋

建議將當前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 語句重新編寫為使用 TOP 語法。有關更多信息,請參見 DELETE、INSERT 或 UPDATE。

對于在遠程表和本地及遠程分區視圖上執行的 INSERT、UPDATE 和 DELETE 語句,忽略 SET ROWCOUNT 選項設置。

若要關閉該選項(以便返回所有的行),請將 SET ROWCOUNT 指定為 0。

說明 設置 SET ROWCOUNT 選項將使大多數 Transact-SQL 語句在已受指定數目的行影響后停止處理。這包括觸發器和 INSERT、UPDATE 及 DELETE 等數據修改語句。ROWCOUNT 選項對動態游標無效,但限制鍵集的行集和不感知游標。使用該選項時應謹慎,它主要與 SELECT 語句一起使用。

如果行數的值較小,則 SET ROWCOUNT 替代 SELECT 語句 TOP 關鍵字。

SET ROWCOUNT 的設置是在執行或運行時設置,而不是在分析時設置。

權限

SET ROWCOUNT 權限默認授予所有用戶。

示例

SET ROWCOUNT 在指定的行數后停止處理。在下例中,注意有 x 行滿足預付款少于或等于 $5,000 的條件;但是,從更新所返回的行數中可以看出并非所有的行都得到處理。ROWCOUNT 影響所有的 Transact-SQL 語句。

USE pubs
GO
SELECT count(*) AS Cnt
FROM titles 
WHERE advance >= 5000
GO

下面是結果集:

Cnt       
----------- 
11          

(1 row(s) affected)

現在,將 ROWCOUNT 設置為 4,并更新預付款等于或大于 $5,000 的所有行。
SET ROWCOUNT to 4.
SET ROWCOUNT 4
GO
UPDATE titles
SET advance = 5000
WHERE advance >= 5000
GO

熱詞搜索:

上一篇:SQL Server 2000 下日期操作的實用范例
下一篇:怎樣對SQL 數據表和數據庫進行迭代操作

分享到: 收藏
主站蜘蛛池模板: 死神来了6绝命终结站| 哗鬼住正隔篱| 抖色| 公主们的战国| 玉林电视台| 美丽的邂逅| 演员任贤齐简历| 三年片电影| 我爱我爹全集高清版免费观看| 番金连| 欢场| 老司机免费看视频| 朱莉·德尔佩| 风间由美的电影| 古装发型| 凯登克罗斯| 阿尔法变频器说明书| 王春宇| 太太的情人电影| 吴添豪| 重温经典节目预告| 红日歌词中文谐音歌词| 老阿姨电视剧在线观看| 地板鞋编织方法的视频教程| 董骥| yy五项滚刀骂人套词| 天上人间电影| 大学生搜| 大世界电影| 石灰和碱的6种配方| 在线免费电影网站| porn21| 挠60分钟美女腋窝视频| 汤唯和梁朝伟拍戏原版视频| 太微玉清宫| 战无双| 夫妻情感生活| 电影终极之战 电影| 玉楼春完整版电视剧在线观看| 冥界警局| 二次元美女放屁|