触发器是一种特殊类型的存储过程,作为对SQL Server对象活动的响应而执行。触发器存储在系统的内存中,只在特定事件发生时执行。与普通的存储过程不同,触发器不接受参数,也不能手动执行。
在这篇文章中,我们将探讨如何在SQL Server中创建和使用触发器。
在SQL Server中主要有三种类型的触发器。
- DML 触发器
- DDL 触发器
- LOGON 触发器
让我们在本指南中探讨这些触发器。
SQL Server DML 触发器
DML或数据处理语言触发器是一种触发器,它可以在表或视图上进行插入、更新和删除操作时触发。DML触发器将在任何有效的操作被执行时运行,无论是否有任何行被影响。
触发器后创建DML
在SQL Server中,你可以使用创建触发器语句来创建一个DML触发器。
CREATE TRIGGER schema_name.trigger_name
ON TABLE_NAME
after [INSERT,UPDATE, DELETE]
AS
-- trigger code to run
让我们来分解一下上面的语法。
- schema_name - 存储触发器的模式的名称。
- trigger_name - 触发器的名称。
- table_name - 指定的触发器所应用的表的名称。
- After - 后面的子句,用于定义触发器将在哪些条件下应用。
为了学习如何创建和使用DML触发器,让我们举一个实际例子。
创建样本数据库,并按照下面显示的一组查询中的规定插入数据。
-- create sample database
CREATE DATABASE sales;
GO
-- switch db;
USE sales;
-- create table
CREATE TABLE sales(
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
product_name VARCHAR(50),
price money,
quantity INT
);
-- insert sample data
INSERT INTO sales(product_name, price, quantity)
VALUES ('iPhone Charger', $9.99, 10),
('Google Chromecast', $59.25, 5),
('Playstation DualSense Wireless Controller', $69.00, 100),
('Xbox Series S', $322.00, 3),
('Oculus QUest 2', $299.50, 7),
('Netgear Nighthawk', $236.30, 40),
('Redragon S101', $35.98, 100),
('Star Wars Action Figure', $17.50, 10),
('Mario Kart 8 Deluxe', $57.00, 5);
一旦我们有了样本数据,我们就可以继续创建一个DML触发器,在对该表进行更新操作时触发。
考虑一下下面的例子。
-- create table to store update history
CREATE TABLE ModifiedDate (id INT, date_ datetime)
GO
-- create trigger
CREATE TRIGGER dbo.update_trigger
ON sales
after UPDATE
NOT FOR replication
AS
BEGIN
INSERT INTO ModifiedDate
SELECT id, getdate()
FROM inserted
END
上面的查询将创建一个触发器,当我们对表进行更新时触发。为了测试触发器,我们可以运行一个更新程序。
-- update table
UPDATE sales SET price = $10.10
WHERE id = 1;
执行后,我们可以通过选择ModifiedDate表中的列来检查触发器是否工作。
-- check ModifiedDate table
SELECT * FROM ModifiedDate;
在SSMS中,你可以通过扩展触发器选项来查看表的触发器。

创建 INSTEAD OF Triggers
在SQL Server中另一种类型的DML触发器是INSTEAD OF触发器。这些触发器是代替DML语句执行的类型。例如,如果我们指定一个删除语句,我们可以使用INSTEAD OF触发器在操作之前运行。
创建一个代替触发器的语法如图所示。
CREATE TRIGGER schema_name.trigger_name
ON TABLE_NAME
instead OF [INSERT, UPDATE, DELETE]
AS
-- trigger statements
例如,下面的查询创建了一个触发器,当对表进行插入操作时显示一条信息。
-- create instead of trigger
CREATE TRIGGER instead_insert
ON sales
instead OF INSERT
AS
BEGIN
SELECT 'You cannot insert in this table' AS Error
END
-- run instead_insert trigger
INSERT INTO sales(product_name, price, quantity)
VALUES ('iPhone Charger', $9.99, 10);
一旦我们运行上述查询,我们应该得到一个信息,表明我们不能对该表进行插入操作。
Error
-------------------------------
你不能在这个表中插入
SQL DDL Triggers
DDL或数据定义语言是响应服务器或数据库事件的触发器,而不是一个表。DDL触发器将对诸如DROP, GRANT, DENY, REVOK, UPDATE STATISTICS, CREATE, 和ALTER等事件做出响应。
创建DDL触发器
CREATE TRIGGER trigger_name
ON DATABASE | ALL server
WITH ddl_trigger_parameters
FOR event_type | event_group
AS
-- trigger statements
我们可以将语法分解为:
- trigger_name - 触发器的唯一名称。
- 数据库或所有服务器 - 指定触发器的执行地点。如果它适用于数据库,则是数据库;如果适用于服务器范围,则是所有服务器。
- ddl_trigger_parameter - DDL参数,如execute as,或encrypt as。
- event_type - 引发触发器的DDL事件。
下面的查询示例创建了一个DDL触发器,当发出DROP表语句时触发。
-- create ddl trigger
CREATE TRIGGER drop_ddl_trigger
ON DATABASE
FOR drop_table
AS
BEGIN
SELECT eventdata();
END
一旦我们在数据库上运行一个drop事件,触发器将使用eventdata()函数显示事件信息。
我们可以测试这个触发器。
-- test trigger
DROP TABLE sales;
该查询应该返回关于该事件的XML信息,因为。

在SSMS中,你可以通过扩展目标数据库中Programmability下的Database Triggers来查看触发器。

启用/禁用触发器
SQL Server允许你启用和停用触发器。要在一个表上启用一个触发器,请使用查询作为。
enable TRIGGER update_trigger ON sales;
其中update_trigger代表触发器名称,sales代表表的名称。
你也可以在一个表上启用所有触发器,例如
enable TRIGGER ALL ON TABLE_NAME;
要启用数据库触发器,请使用查询。
enable TRIGGER drop_ddl_trigger ON sales;
这里,drop_ddl_trigger代表触发器名称,sales代表数据库。
要启用所有的数据库触发器,请使用查询。
enable TRIGGER ALL ON sales;
要禁用一个表或数据库触发器,用disable
替换enable关键字。
删除触发器
要删除一个触发器,可以使用drop语句,如图所示。
DROP TRIGGER IF EXISTS trigger_name;
SQL Server 显示所有触发器
要查看一个SQL Server实例中的所有触发器,可以使用如图所示的查询。
SELECT name,type_desc, is_disabled, is_instead_of_trigger FROM sys.triggers WHERE TYPE = 'TR'
该查询应该返回SQL Server实例中的所有触发器,如。
SQL Server LOGON 触发器
登录触发器是在服务器上发生登录活动时执行的触发器类型。这些类型的触发器在成功认证之后,但在创建用户会话之前运行。因为它们是用来处理登录活动的,所以我们在服务器级别上创建它们,如下面的例子所示。
注意:下面的触发器可能会阻止未来对服务器的登录。确保在退出登录前删除。
注意 - 


















.
-- create logon trigger
CREATE TRIGGER login_tg
ON ALL server
FOR logon AS
BEGIN
SELECT 'A trigger after login' AS [message]
END
当用户登录到服务器时,该触发器将显示一条消息。
总结
在本指南中,你了解了各种类型的触发器,如何在SQL Server中创建、启用、禁用、删除和查看触发器。