MSSQLSERVER資料庫 觸發器

2022-07-01 22:21:12 字數 3415 閱讀 9961

參考了別人寫的文章,我刪除掉一些廢話,只看一些我想看的資訊。整理了一下,記錄在這裡,方便以後查閱!

1.當觸發insert觸發器時,新的資料行就會被插入到觸發器表和inserted表中。

2.當觸發delete觸發器後,從觸發器表中刪除的行將被儲存到deleted表中。注意:deleted表和觸發器表中沒有相同的行。執行truncate table語句時觸發器不會執行。

3.當觸發update觸發器時,更新前的資料移入到deleted表,更新後資料被移入到inserted表。

一、使用例子

例子1:建立乙個觸發器,如果產品有訂購歷史,則回滾。

create

trigger

trig_deleteproduct

onproducts

fordelete

asif (select

count(*) from

[order details

]as od inner

join deleted as d on od.productid = d.productid) >

0begin

raiserror('

該產品已經有訂購資訊,不能被刪除!

',16,1

)

rollback

transaction

return

end

例子2:保證不能刪除表中資料

create

trigger

trig_protectdata

on tablename for

delete

asraiserror('

不能刪除改表中的資料

',16,1,'提示'

)rollback

transaction

return

例子3:保證每次最多只能刪除乙個雇員

create

trigger

trig_deleteemployee

onemployees

fordelete

asif (select

count(*) from deleted) >

1begin

raiserror('

一次不能刪除多條資料!

',16,1

)

rollback

transaction

return

end

例子4:監視指定列的資料更新

create

trigger

trig_updateemployee

onemployees

forupdate

asif

update

(firstname)

begin

raiserror('

firstname不能更新!

',16,1

)

rollback

transaction

return

end

例子5:更新時引起關聯表某字段值的更新

alter

trigger

[tr_updatestudent]on

[dbo

].[t_student

]for

update

asdeclare

@updatei

intbegin

select

@updatei

= tid from

inserted;

update dbo.t_teacher set xm='0

'where id=

@updatei

;

end

以後發現有新的例子 繼續新增在。。

二、觸發器多一點了解

1、觸發器的被動型

被動型的意思是指觸發器發生在事務之後。當啟用觸發器時,整個查詢已經執行並且事務也已經被記錄到日誌中(但未提交,只是記錄到啟用觸發器的語句點)。這意味著如果觸發器需要回滾,那麼必須撤銷已經做的所有工作。這和約束是不同,約束是主動的,約束是發生在語句真正執行前。這意味著約束會檢測可能失敗的操作,並且在程序的前期就予以阻止。所以約束通常執行得快一些-在更為複雜的查詢中速度更快。注意,只有在發生回滾時,約束明顯更快。

如果正在處理少量回滾,而且受影響的語句的複雜性較低,執行之間較短,那麼觸發器和約束之間沒有太大的區別。但是在無法預知回滾的數量的時候,堅持使用約束的效率更好

2、使用if update()和columns_update()

update()函式只在觸發器的作用域內適用。它唯一的目的是提供乙個布林值,來說明特殊列是否已經更新。

columns_update()函式和update()的執行方式不同,但目的相同。columns_update()函式可以一次檢查多列。為了實現這一點,該函式使用了位掩碼。

於上圖的情況,資料的單個位元組說明了第2,第3,以及第6列已經更新,而其他列沒有更新。對於超過8列的情況,sql server就會在右邊新增另乙個位元組並且繼續計數。

對於上圖,這次是跟心了第2,第9以及第14列。

示例:column_update()>0  檢查是否有列被更新。

column_update()^21=0  檢查是否更新了所有指定列(1、3、5)。

建立觸發器如下:

create triggerupdatecheck2

ontb_money

for update

asif columns_updated()&7 = 3 --如果同時更新了name,mymoney才觸發

begin

print('我的錢和姓名改變了!');

end

執行語句以及說明如下:

update tb_money set name ='張飛

'where id =

1update tb_money set name ='趙雲

', mymoney =

102where id =1--

此行會啟用觸發器

--計算過程如下

--id name tb_money

--1 1 1 7(全部更新為7)

--0 1 1 name和tb_money同時更新為(與3=3)

MS SQLserver資料庫安裝

sql2008的安裝 1,雙擊開啟setup安裝檔案 2,點選 全新安裝或向現有安裝新增功能 3,安裝程式支援規則,安裝完之後,點選確定 4,輸入產品的金鑰,點選下一步 5,彈出 安裝程式支援檔案 點選安裝 6,安裝程式支援規則,點選下一步 7,設定角色選擇 sql sever 功能安裝 s 點選下...

MS SQL Server 資料庫命名規範

命名規範 表 表名如order useraccout 符合以下規範 1.統一採用單數形式,反對orders 2.首字母大寫,多個單詞的話,單詞首字母大寫,反對order useraccout order 3.避免中文拼音,反對agentbaoci 4.避免下劃線連線,反對user accout 下劃...

c 連線資料庫MS SQL Server

c 連線資料庫ms sql server 方法一 可以利用sqlconnectionstringbuilder,這樣不必去記住名稱。using system.data.sql using system.data.sqlclient sqlconnectionstringbuilder scsb ne...