五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

SQL Server觸發(fā)器及觸發(fā)器中的事務(wù)學(xué)習(xí)

發(fā)布日期:2022-01-26 14:52 | 文章來源:站長之家

在下面的內(nèi)容,用到一些SQL Server 觸發(fā)器和事務(wù)的一些術(shù)語,如果有些不明白的地方,可以查閱MSDN資料庫,或SQL Server本地幫助文檔:

DML觸發(fā)器(DML Triggers) DDL觸發(fā)器(DDL Triggers) 事務(wù)模式(Transaction modes) 顯式事務(wù)(Explicit Transactions) 自動提交事務(wù)(Autocommit Transactions) 隱式事務(wù)(Implicit Transactions) 批范圍的事務(wù)(Batch-scoped Transactions)

After觸發(fā)器 Vs Instead Of觸發(fā)器

After 觸發(fā)器將在處理觸發(fā)操作(Insert、Update 或 Delete)、Instead Of 觸發(fā)器和約束之后激發(fā)。Instead Of是將在處理約束前激發(fā),以替代觸發(fā)操作。下面兩張圖描述了After觸發(fā)器和Instead Of觸發(fā)器的執(zhí)行先后順序。

image
image

圖1 圖2

左邊的圖1,描述了After觸發(fā)器執(zhí)行順序情況,我在這里通過一個(gè)簡單的例子來說明After觸發(fā)器的執(zhí)行順序,以便能加深對左圖1 After觸發(fā)器的理解。

先創(chuàng)建表Contact

use tempdb
Go
if object_id('Contact') Is Not null 
 Drop Table Contact
Go
Create Table Contact
(
 ID int Primary Key Identity(1,1),
 Name nvarchar(50),
 Sex nchar(2) Check(Sex In(N'F',N'M')) Default('M')
)
Go

再創(chuàng)建After觸發(fā)器tr_Contact

use tempdb
Go
If Exists(Select 1 From sys.triggers Where name='tr_Contact')
 Drop Trigger tr_Contact 
Go
Create Trigger tr_Contact On Contact After Insert
As
Select Name,Sex From Inserted /*顯示Inserted表的內(nèi)容,用來判斷觸發(fā)器執(zhí)行的先后順序*/
Go

然后Insert數(shù)據(jù),判斷After觸發(fā)器的執(zhí)行順序

use tempdb
Go
Insert Into Contact (Name,Sex) Values ('Bill','U')
Go

這里,在沒有運(yùn)行Insert語句之前,我們可以判斷,執(zhí)行Insert過程會觸發(fā)Check錯(cuò)誤,因?yàn)樽侄蜸ex的值必須是”F” Or “M”,而這里將要插入的是”U”.好了,再來看運(yùn)行Insert語句后的情況。

image

本例子,只看到引發(fā)Check約束沖突的錯(cuò)誤,而無法看到Inserted表的數(shù)據(jù),說明一點(diǎn)就是,引起Check約束之前,不會引發(fā)After觸發(fā)器tr_Contact的操作。這就驗(yàn)證了圖1的After觸發(fā)器執(zhí)行順序情況。

好了,接下來,我們再測試Instead Of觸發(fā)器 圖2的情況;我使用上邊建好的測試表Contact來舉例。

先修改觸發(fā)器tr_Contact內(nèi)容,

use tempdb
Go
If Exists(Select 1 From sys.triggers Where name='tr_Contact')
 Drop Trigger tr_Contact 
Go
Create Trigger tr_Contact On Contact Instead Of Insert
As
print '觸發(fā)器作代替執(zhí)行操作'
Insert Into Contact (Name,Sex) Select Name,Sex From Inserted /*代替觸發(fā)器外面的Insert行為*/
Go

再Insert數(shù)據(jù),觀察SQL Server執(zhí)行后的提示信息,

use tempdb
Go
Insert Into Contact (Name,Sex) Values ('Bill','U')
Go

image

這里,看到,先是觸發(fā)器操作,再是Check約束處理。本例中,在觸發(fā)器里面使用一條Insert的語句來描述觸發(fā)器的代替執(zhí)行操作,這SQL語句通過Select表Inserted得到觸發(fā)器外面Insert內(nèi)容。當(dāng)SQL Server執(zhí)行到觸發(fā)器里面的Insert語句,才會引起Check約束處理.倘若,在觸發(fā)器tr_Contact沒有Insert的代替行為,那么就不會出現(xiàn)Check約束處理錯(cuò)誤的信息(注:沒有Check錯(cuò)誤信息,并不表示沒有作Check處理)。修改上邊的觸發(fā)器tr_Contact內(nèi)容,做個(gè)簡易的驗(yàn)證.

use tempdb
Go
If Exists(Select 1 From sys.triggers Where name='tr_Contact')
 Drop Trigger tr_Contact 
Go
Create Trigger tr_Contact On Contact Instead Of Insert
As
print '觸發(fā)器作代替執(zhí)行操作'
Go
use tempdb
Go
Insert Into Contact (Name,Sex) Values ('Bill','U')
Go
Select * From Contact

imageimage

可以看到,Instead Of 觸發(fā)器tr_Contact內(nèi)容沒有Insert的SQL語句,不會引發(fā)Check處理錯(cuò)誤,而且檢查Insert動作后的結(jié)果,發(fā)現(xiàn)表Contact也沒有之前我們Insert的數(shù)據(jù)。這些足夠驗(yàn)證了Instead Of觸發(fā)器的執(zhí)行先后順序和代替執(zhí)行操作。

DML 觸發(fā)器 Vs DDL 觸發(fā)器


DML 觸發(fā)器在 Insert、Update 和 Delete 語句上操作,可以作為After 觸發(fā)器 和 Instead Of 觸發(fā)器。

DDL 觸發(fā)器對 Create、Alter、Drop 和其他 DDL 語句以及執(zhí)行 DDL 式操作的存儲過程執(zhí)行操作,只可作為After觸發(fā)器,不能Instead Of觸發(fā)器。

前面的內(nèi)容,有描述DML觸發(fā)器中的After & Instead Of觸發(fā)器內(nèi)容,下面直接來看DDL的操作順序:

image

圖3.

從圖3.可以知道,在DDL觸發(fā)器中,是沒有創(chuàng)建Inserted & Deleted過程的,我們通過簡單的例子去測試下。

創(chuàng)建一個(gè)服務(wù)器范圍內(nèi)的DDL觸發(fā)器,檢查有沒有Inserted 表,

use master
Go
If Exists(Select 1 From sys.server_triggers Where name='tr_createDataBase')
 Drop Trigger tr_createDataBase On All Server
Go
Create Trigger tr_createDataBase On All Server After Create_DataBase
As 
Select * From inserted
Go

執(zhí)行創(chuàng)建數(shù)據(jù)庫SQL語句,

use master
Go
Create Database myDataBase On Primary
(Name='MyDataBase_Data',Filename='E:\DATA\SQL2008DE01\MyDataBase_Data.mdf') Log On 
(Name='MyDataBase_Log',Filename='E:\DATA\SQL2008DE01\MyDataBase_Log.ldf')
Go

返回錯(cuò)誤信息,

image

使用上邊相同的方法,我們驗(yàn)證DDL觸發(fā)器中,不會創(chuàng)建Deleted表;是否創(chuàng)建Deleted & Inserted,也可以認(rèn)為是DDL觸發(fā)器與DML觸發(fā)器不同之處。在DLL觸發(fā)器與DML觸發(fā)器不同的一個(gè)重要特征是作用域,DML觸發(fā)器只能應(yīng)用在數(shù)據(jù)庫層(Database Level)的表和視圖上,而DDL觸發(fā)器應(yīng)用于數(shù)據(jù)庫層(Database Level)和服務(wù)器層(Server Level);DDL觸發(fā)器的作用域取決于事件。下面簡單描述下事件組的內(nèi)容。

數(shù)據(jù)庫層事件主要包含:

    DDL Table events: Create table, Alter table, Drop table DDL view events : Create view, Alter view, Drop view DDL trigger events :Create trigger, Drop trigger, Alter trigger DDL synonym events: Create synonym, drop synonym DDL Index events: Create index, Alter index, Drop Index DDL Database level security events: Create User, Drop user, Alter user Create role, Drop role, Alter role Create application role, Drop application role, Alter Application role Create Schema, Drop Schema, Alter Schema Grant database access, Revoke database access, Deny Database access DDL Service broker events: Create Message type, Alter Message type, Drop Message type Create contract, Drop contract, Alter contract Create Service, Alter service, Drop Service Create route, Drop route, Alter route

服務(wù)器層事件主要包含:

    Create Database, Drop Database Create Login, Drop Login, Alter Login

觸發(fā)器和事務(wù)的故事


在前面的幾個(gè)例子中,如DML觸發(fā)器例子,Insert 語句執(zhí)行后,因?yàn)橛|發(fā)器操作 或 Check處理錯(cuò)誤,沒有把數(shù)據(jù)真正的插入到表Contact中。其實(shí),當(dāng)執(zhí)行觸發(fā)器時(shí),觸發(fā)器的操作好像有一個(gè)未完成的事務(wù)在起作用。 通過幾個(gè)例子來講解觸發(fā)器和事務(wù)的故事。

創(chuàng)建一個(gè)表ContactHIST,用于對表Contact作Update Or Delete操作時(shí),把操作前的數(shù)據(jù)Insert到表ContactHIST中。

use tempdb
Go
if object_id('ContactHIST') Is Not null 
 Drop Table ContactHIST
Go
Create Table ContactHIST
(
 ID int Primary Key Identity(1,1),
 ContactID int,
 Name nvarchar(50),
 Sex nchar(2),
 ActionType nvarchar(10) Check(ActionType In('Update','Delete')),
 LastUpdateDate datetime Default(getdate())
)
Go

修改觸發(fā)器tr_Contact內(nèi)容,

use tempdb
Go
If Exists(Select 1 From sys.triggers Where name='tr_Contact')
 Drop Trigger tr_Contact 
Go
Create Trigger tr_Contact On Contact After Update,Delete
As
Insert Into ContactHIST(ContactID,Name,Sex)
 Select ID,Name,Sex From deleted 
Rollback Tran 
國內(nèi)礦機(jī)海外托管產(chǎn)品方案

-->

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信