TOP

2013年7月1日 星期一

[SQL]Trigger(觸發程序)大批異動資料時,要注意的事


看這篇文章前,您必須先瞭解什麼是Trigger(觸發程序),Trigger可以想像它是一個警報器,只有三件事情可以使這個警報器發揮作用,
Insert、Update和Delete這三個指令,而這個警報器用在資料表被這三個指令使用時觸發,因此我們可以讓資料表插入資料時,讓Trigger
去幫我們檢查或是更新資料時另外加一筆資料到另一張資料表,今天介紹Trigger不是重點,今天要說的是大批異動資料時通常會忽略的事。

以下使用北風資料庫來做範例
[Orders2]             (訂單資料表)
[OrderDetails2]    (訂單明細)

為了快速達成Demo效果先建立資料表
Orders2、OrderDetails2,並將資料轉入
CREATE TABLE [dbo].[Orders2](
 [OrderID] [int]  NOT NULL,
 [CustomerID] [nvarchar](5) NULL,
 [EmployeeID] [int] NULL,
 [OrderDate] [datetime] NULL,
 [RequiredDate] [datetime] NULL,
 [ShippedDate] [datetime] NULL,
 [ShipVia] [int] NULL,
 [Freight] [money] NULL,
 [ShipName] [nvarchar](40) NULL,
 [ShipAddress] [nvarchar](60) NULL,
 [ShipCity] [nvarchar](15) NULL,
 [ShipRegion] [nvarchar](15) NULL,
 [ShipPostalCode] [nvarchar](10) NULL,
 [ShipCountry] [nvarchar](15) NULL)
 
INSERT INTO [Orders2] SELECT * FROM [Orders]
------------------------------------------------------------- 
CREATE TABLE [dbo].[OrderDetails2](
 [OrderID] [int] NOT NULL,
 [ProductID] [int] NOT NULL,
 [UnitPrice] [money] NOT NULL,
 [Quantity] [smallint] NOT NULL,
 [Discount] [real] NOT NULL)
 
INSERT INTO  [OrderDetails2] SELECT * FROM [OrderDetails]

建立Trigger




















一般來說Trigger會這樣寫,這樣可以讓刪除[orders]的資料時可以將刪除的動作觸發Trigger並且刪除[OrderDetails]

--Trigger01
Create TRIGGER [dbo].[Orders2_trigger_del] ON [dbo].[Orders2]
FOR Delete --指定Delete觸發本事件
AS
DECLARE @orderid int
 SELECT @orderid=orderID FROM DELETED
 Delete OrderDetails2 where OrderID=@orderid 


今天我們要刪除訂單,以下指令將會刪除14筆資料
DELETE orders  where EmployeeID=5 AND ShipVia=1

如果使用 Trigger01 的方式,就會發現刪了14筆訂單主檔跟第一筆訂單的明細,可是其他訂單的明細卻沒有跟著刪除
 

--Trigger02 
Alter TRIGGER [dbo].[Orders2_trigger_del] ON [dbo].[Orders2]
FOR Delete --指定Delete觸發本事件
AS
    Delete OrderDetails2 where OrderID in
    (SELECT orderID FROM DELETED)--此Trigger包含N筆資料
Trigger02這種方式也可以改用迴圈去處理各筆資料,
如此一來,我們刪除訂單的同時,Trigger也會確實地將明細也一併清除


沒有留言:

張貼留言