觸發器是一種特殊的存儲過程,類似于其它編程語言中的事件函數,SQL Server™ 允許為 INSERT、UPDATE、DELETE 創建觸發器,當在表(視圖)中插入、更新、刪除記錄時,觸發一個或一系列 T-SQL 語句。
1:創建觸發器:
Œ觸發器可以在企業管理器里創建,也可以在表名上點右鍵->“所有任務”->“管理觸發器”來創建。
用 CREATE TRIGGER創建觸發器
CREATE TRIGGER 觸發器名稱
ON 表名
FOR INSERT、UPDATE 或 DELETE
AS
T-SQL 語句
例:
USE Northwind
CREATE TRIGGER Category_Delete
ON Categories
FOR DELETE
AS
UPDATE P SET Discontinued = 1
FROM Products AS P INNER JOIN deleted AS d
ON P.CategoryID = d.CategoryID
可以使用IF UPDATE語句IF UPDATE (<column_name>)定義一個監視指定列的數據更新的觸發器。這樣,就可以讓觸發器容易的隔離出特定列的活動。
USE Northwind
GO
CREATE TRIGGER Employee_Update
ON Employees
FOR UPDATE
AS
IF UPDATE (EmployeeID)
BEGIN
RAISERROR ('Transaction cannot be processed./
***** Employee ID number cannot be modified.', 10, 1)
ROLLBACK TRANSACTION
END
可能你需要在視圖上創建觸發器,如果你按照以上例子的方法來創建的話,可能會出現“對象無效”的錯誤。在 SQL Server™ 聯機叢書中,是沒有說觸發器不能在視圖上創建的, 并且在語法解釋中表明:在 CREATE TRIGGER 的 ON 之后可以是視圖。實際上,我們不能在視圖上創建 FOR 觸發器,而應該創建 INSTEAD OF 觸發器.每一個表或視圖只能有一個INSTEAD OF觸發器。不能在帶有WITH CHECK OPTION定義的視圖中創建INSTEAD OF觸發器。
create trigger 觸發器名
on 表名/視圖
instead of delete/update/insert
as
SQL語句
2:刪除觸發器
Œ用查詢分析器刪除
在查詢分析器中使用 drop trigger 觸發器名稱 來刪除觸發器。也可以同時刪除多個觸發器:drop trigger 觸發器名稱,觸發器名稱...
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'employee_insupd' AND type = 'TR')//觸發器是否存在
DROP TRIGGER employee_insupd
GO
用企業管理器刪除
在企業管理器中,在表上點右鍵->“所有任務”->“管理觸發器”,選中所要刪除的觸發器,然后點擊“刪除”。
3:重命名觸發器
Œ用查詢分析器重命名
exec sp_rename 原名稱, 新名稱
sp_rename 是 SQL Server™ 自帶的一個存儲過程,用于更改當前數據庫中用戶創建的對象的名稱,如表名、列表、索引名等。
用企業管理器重命名
在表上點右鍵->“所有任務”->“管理觸發器”,選中所要重命名的觸發器,修改觸發器語句中的觸發器名稱,點擊“確定”。
4:其他
觸發器內部語句出錯時,前面對數據更改操作將會無效。
觸發器中可以使用大多數 T-SQL 語句,但如下一些語句是不能在觸發器中使用的。
CREATE 語句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
- ALTER 語句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
- DROP 語句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
- DISK 語句,如:DISK INIT、DISK RESIZE。
- LOAD 語句,如:LOAD DATABASE、LOAD LOG。
- RESTORE 語句,如:RESTORE DATABASE、RESTORE LOG。
- RECONFIGURE
- 說明:有人說不能用 TRUNCATE TABLE 語句,其實是可以的。