2011年3月21日 星期一

建立觸發程序

參考來源(寫得很清楚)
---
觸發程序是整個資料異動交易的延伸,從處理異動資料作業到觸發程序執行完畢,都是資料異動交易的範圍。
新增(INSERT):新增資料後,會將被新增的資料存放在INSERTED資料表,以供觸發程序使用。
刪除(DELETE):刪除資料後,會將被刪除的資料存放在DELETED資料表,以供觸發程序使用。
更新(UPDATE):更新資料後,會將修改前的資料存放在DELETED資料表,修改後的資料存放在INSERTED資料表,以供觸發程序使用。
當資料表執行INSERT、UPDATE、DELETE之後,執行觸發程序,可以在INSERTED跟DELETED資料表,取得剛異動的資料,來做資料上的處理或判斷,如果觸發程序執行發生錯誤時,整個資料異動都會不成立,就是會ROLLBACK,也可以在觸發程序裡執行ROOLBACK,將資料恢復到原先的資料。

觸發程序有二種:
AFTER觸發程序:只能用在資料表,在執行資料表的INSERT、UPDATE、DELETE之後執行,可針對資料異動做額外的動作(執行T-SQL),如新增資料到資料表。
INSETEAD OF觸發程序:能用在資料表或檢視表,是在取代INSERT、UPDATE、DELETE的動作,對新增資料的值做額外的處理。

AFTER觸發程序:
CREATE TABLE Stocks
(
ProductID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ProductName nvarchar(256),
Stocks int
)
GO
INSERT INTO Stocks(ProductName, Stocks) VALUES('紅原子筆', 100)
INSERT INTO Stocks(ProductName, Stocks) VALUES('藍原子筆', 50)
GO
CREATE TABLE Orders
(
OrderID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ProductID int,
Orders int
)
GO
CREATE TRIGGER tri_InsertOrders ON Orders
AFTER INSERT
AS
BEGIN
DECLARE @vorders int, @vproductID int
SELECT @vorders = Orders, @vproductID = ProductID FROM INSERTED
UPDATE Stocks SET Stocks = Stocks - @vorders WHERE ProductID = @vproductID
END
GO
INSERT INTO Orders(ProductID, Orders) VALUES('1', 10)
GO

INSETEAD OF觸發程序:
CREATE TABLE Stocks
(
ProductID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ProductName nvarchar(256),
Stocks int
)
GO
CREATE TRIGGER tri_InsertStocks ON Stocks
INSTEAD OF INSERT
AS
BEGIN
--將ProductName加入'ABC'字串
DECLARE @NewProductName nvarchar(256), @NewStocks int
SELECT @NewProductName = 'ABC' + ProductName, @NewStocks = Stocks FROM INSERTED
INSERT INTO Stocks(ProductName, Stocks) VALUES(@NewProductName, @NewStocks)
END
GO
INSERT INTO Stocks(ProductName, Stocks) VALUES('1', 10)
GO

沒有留言:

張貼留言