SQL Server約束和DML觸發器的比較

iSQlServer發表於2009-01-12
這些年來,我發現許多開發者對於何時使用資料操縱語言(DML)觸發器與何時使用約束感到迷惑。許多時候,如果沒有正確應用這兩個物件,就會造成問題。本文將為您何時使用約束和DML觸發器提供一些啟示,以幫助你避免我遇到的糾正問題。

  何為約束和DML觸發器?

  約束是資料庫引擎用來約束一個表或一個表關係中的資料,以維持資料庫完整性的一個物件。這些約束包括CHECK、UNIQUE、PRIMARY KEY等。這裡提供在TSQL中定義約束的更多細節。

  AFTER觸發器是一種特殊型別的TSQL程式碼塊,當一個DML語句根據觸發器定義的表執行時,它得到執行。(在本文中我僅指這種觸發器。)

  何時使用約束和DML觸發器

  使用約束比使用觸發器更加有利(如果你可以使用約束的話)。你總是可以寫出一個觸發器,完成和一個約束相同的工作,但這樣做一般沒有什麼意義。

  考慮使用一個外來鍵約束和DML觸發器。使用外來鍵約束的目的是為了確保允許進入一個表的一列或多列的值出現在一個單獨表的一列或多列中。你可以使用DML觸發器建立相同的功能。

  列表A建立了SalesHistory和I_SalesProducts表,我將在例子中使用它們,並給它們載入一些資料。

以下為引用的內容:

IF OBJECT_ID('SalesHistory')>0

DROP TABLE SalesHistory;

GO

CREATE TABLE [dbo].[SalesHistory]

(

 [SaleID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,

 [Product] [varchar](10) NULL,

 [SaleDate] [datetime] NULL,

 [SalePrice] [money] NULL

)

GO DECLARE @i SMALLINT

SET @i = 1WHILE (@i <=100)

BEGIN

INSERT INTO SalesHistory(Product, SaleDate, SalePrice)

VALUES('Computer', DATEADD(mm, @i, '3/11/1919'), DATEPART(ms, GETDATE()) + (@i + 57))

INSERT INTO SalesHistory(Product, SaleDate, SalePrice)

VALUES('BigScreen', DATEADD(mm, @i, '3/11/1927'), DATEPART(ms, GETDATE()) + (@i + 13))

INSERT INTO SalesHistory(Product, SaleDate, SalePrice)

VALUES('PoolTable', DATEADD(mm, @i, '3/11/1908'), DATEPART(ms, GETDATE()) + (@i + 29))SET @i = @i + 1

END

GOINSERT INTO l_SalesProducts(Product)

SELECT 'BigScreen'

UNION

SELECT 'Computer'

UNION

SELECT 'PoolTable'

  現在我有了一些表和一些資料可供利用,讓我們在SaleHistory表中建立一個外來鍵約束。

以下為引用的內容:

ALTER TABLE SalesHistory

ADD CONSTRAINT fk_SalesHistory FOREIGN KEY (Product) REFERENCES

l_SalesProducts(Product)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-536514/,如需轉載,請註明出處,否則將追究法律責任。

相關文章