自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談SQL Server觸發(fā)器的使用

數(shù)據(jù)庫 SQL Server
觸發(fā)器(trigger)是個特殊的存儲過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動,而是由個事件來觸發(fā)。本文將介紹SQL Server觸發(fā)器的使用

觸發(fā)器建立的代碼

Create Trigger TG_ProjectName
On table1
After Update
As
Update table2
Set [工程名]=b.工程名
from table2 a,inserted b
where a.ProjID = b.ID

關(guān)于觸發(fā)器中Inserted和Deleted的解釋。

inserted觸發(fā)器語句中使用了兩種特殊的表:deleted 表和 inserted 表。Microsoft® SQL Server 2000 自動創(chuàng)建和管理這些表??梢允褂眠@兩個臨時的駐留內(nèi)存的表測試某些數(shù)據(jù)修改的效果及設(shè)置觸發(fā)器操作的條件;然而,不能直接對表中的數(shù)據(jù)進(jìn)行更改。

inserted 和 deleted 表主要用于觸發(fā)器中:

◆擴(kuò)展表間引用完整性。

◆在以視圖為基礎(chǔ)的基表中插入或更新數(shù)據(jù)。

◆檢查錯誤并基于錯誤采取行動。

◆找到數(shù)據(jù)修改前后表狀態(tài)的差異,并基于此差異采取行動。

Deleted 表用于存儲 DELETE 和 UPDATE 語句所影響的行的復(fù)本。在執(zhí)行 DELETE 或 UPDATE 語句時,行從觸發(fā)器表中刪除,并傳輸?shù)?deleted 表中。Deleted 表和觸發(fā)器表通常沒有相同的行。

Inserted 表用于存儲 INSERT 和 UPDATE 語句所影響的行的副本。在一個插入或更新事務(wù)處理中,新建行被同時添加到 inserted 表和觸發(fā)器表中。Inserted 表中的行是觸發(fā)器表中新行的副本。

更新事務(wù)類似于在刪除之后執(zhí)行插入;首先舊行被復(fù)制到 deleted 表中,然后新行被復(fù)制到觸發(fā)器表和 inserted 表中。

在設(shè)置觸發(fā)器條件時,應(yīng)當(dāng)為引發(fā)觸發(fā)器的操作恰當(dāng)使用 inserted 和 deleted 表。雖然在測試 INSERT 時引用 deleted 表或在測試 DELETE 時引用 inserted 表不會引起任何錯誤,但是在這種情形下這些觸發(fā)器測試表中不會包含任何行。

說明

如果觸發(fā)器操作取決于一個數(shù)據(jù)修改所影響的行數(shù),應(yīng)該為多行數(shù)據(jù)修改(基于 SELECT 語句的 INSERT、DELETE 或 UPDATE)使用測試(如檢查 @@ROWCOUNT),然后采取相應(yīng)的對策。

SQL Server 2000不允許AFTER 觸發(fā)器引用 inserted 和 deleted 表中的 text、ntext 或 image 列;然而,允許 INSTEAD OF 觸發(fā)器引用這些列。有關(guān)更多信息,請參見 CREATE TRIGGER。

在 INSTEAD OF 觸發(fā)器中使用 inserted 和 deleted 表

傳遞到在表上定義的 INSTEAD OF 觸發(fā)器的 inserted 和 deleted 表遵從與傳遞到 AFTER 觸發(fā)器的 inserted 和 deleted 表相同的規(guī)則。inserted 和 deleted 表的格式與在其上定義 INSTEAD OF 觸發(fā)器的表的格式相同。inserted 和 deleted 表中的每一列都直接映射到基表中的列。

有關(guān)引用帶 INSTEAD OF 觸發(fā)器的表的 INSERT 或 UPDATE 語句何時必須提供列值的規(guī)則與表沒有 INSTEAD OF 觸發(fā)器時相同:

不能為計算列或具有 timestamp 數(shù)據(jù)類型的列指定值。

不能為具有 IDENTITY 屬性的列指定值,除非該列的 IDENTITY_INSERT 為 ON。當(dāng) IDENTITY_INSERT 為 ON 時,INSERT 語句必須提供一個值。 INSERT 語句必須為所有無 DEFAULT 約束的 NOT NULL 列提供值。
對于除計算列、標(biāo)識列或 timestamp 列以外的任何列,任何允許空值的列或具有 DEFAULT 定義的 NOT NULL 列的值都是可選的。

當(dāng) INSERT、UPDATE 或 DELETE 語句引用具有 INSTEAD OF 觸發(fā)器的視圖時,數(shù)據(jù)庫引擎將調(diào)用該觸發(fā)器,而不是對任何表采取任何直接操作。即使為視圖生成的 inserted 和 deleted 表中的信息格式與基表中的數(shù)據(jù)格式不同,該觸發(fā)器在生成執(zhí)行基表中的請求操作所需的任何語句時,仍必須使用 inserted 和 deleted 表中的信息。
傳遞到在視圖上定義的 INSTEAD OF 觸發(fā)器的 inserted 和 deleted 表格式與為該視圖定義的 SELECT 語句的選擇列表相匹配。例如:

CREATE VIEW EmployeeNames (EmployeeID, LName, FName) 
AS
SELECT EmployeeID, LastName, FirstName
FROM Northwind.dbo.Employees

視圖的結(jié)果集有三列:一個 int 列和兩個 nvarchar 列。傳遞到在視圖上定義的 INSTEAD OF 觸發(fā)器的 inserted 和 deleted 表也具有名為 EmployeeID 的 int 列、名為 LName 的 nvarchar 列和名為 FName 的 nvarchar 列。

視圖的選擇列表還包含不直接映射到單個基表列的表達(dá)式。一些視圖表達(dá)式(如常量調(diào)用或函數(shù)調(diào)用)可能不引用任何列,這類表達(dá)式會被忽略。復(fù)雜的表達(dá)式會引用多列,但在 inserted 和 deleted 表中,每個插入的行僅有一個值。如果視圖中的簡單表達(dá)式引用具有復(fù)雜表達(dá)式的計算列,則這些簡單表達(dá)式也有同樣的問題。視圖上的 INSTEAD OF 觸發(fā)器必須處理這些類型的表達(dá)式。有關(guān)更多信息,請參見視圖上 INSTEAD OF 觸發(fā)器中的表達(dá)式和計算列。

順便說一下,當(dāng)對某張表建立觸發(fā)器后,分3種情況討論

1.插入操作(Insert)

Inserted表有數(shù)據(jù),Deleted表無數(shù)據(jù)

2.刪除操作(Delete)

Inserted表無數(shù)據(jù),Deleted表有數(shù)據(jù)

3.更新操作(Update)

Inserted表有數(shù)據(jù)(新數(shù)據(jù)),Deleted表有數(shù)據(jù)(舊數(shù)據(jù))

【編輯推薦】

  1. 講解SQL Server數(shù)據(jù)庫觸發(fā)器的安全隱患
責(zé)任編輯:彭凡 來源: 51CTO
相關(guān)推薦

2010-10-20 14:34:48

SQL Server觸

2010-07-16 10:19:31

2010-11-12 15:35:55

SQL Server約

2010-09-13 17:03:34

sql server觸

2010-07-05 11:01:37

Sql Server觸

2010-11-10 13:37:01

SQL Server觸

2010-10-22 11:10:43

SQL Server觸

2010-11-08 11:49:24

SQL Server管

2010-07-06 14:47:03

SQL Server數(shù)

2010-09-01 16:40:00

SQL刪除觸發(fā)器

2011-03-03 09:30:24

downmoonsql登錄觸發(fā)器

2010-10-19 15:31:40

sql server觸

2010-07-05 11:09:55

SQL Server觸

2011-03-28 10:05:57

sql觸發(fā)器代碼

2019-10-22 07:50:45

SqlServer數(shù)據(jù)庫觸發(fā)器

2010-09-13 16:46:10

SQL Server觸

2010-04-19 10:43:27

SQL Server

2010-06-30 09:36:25

SQL Server

2011-04-01 16:35:09

SQL Server數(shù)觸發(fā)器

2009-04-26 22:27:54

觸發(fā)器密碼修改數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號