触发器是一种特殊的存储过程,类似于其它编程语言中的事件函数,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 语句,其实是可以的。