看這篇文章前,您必須先瞭解什麼是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也會確實地將明細也一併清除

沒有留言:
張貼留言