SQL Server 中的触发器2025年3月17日 | 阅读 10 分钟 ![]() 在系统内存中,触发器是一组唯一命名的 SQL 语句。它是一种特殊的存储过程,当数据库服务器上发生某些事情时会被自动调用。每个触发器都与一个表相关联。 触发器被称为唯一过程,因为它不能像存储过程那样即时调用。过程和触发器之间的主要区别在于,前者在表成为数据更新事件的主题时被自动触发。相反,存储过程必须直接调用。 使触发器区别于存储过程的主要特性如下
触发器语法我们可以使用 CREATE TRIGGER 语句在 SQL Server 中创建触发器,如下所示 此语法的参数说明如下 schema: 这是一个可选参数,用于定义新触发器所属的模式。 trigger_name: 这是一个必需参数,用于定义新触发器的名称。 table_name: 这是一个必需参数,用于定义触发器适用的表名。在表名旁边,我们需要写 AFTER 子句,其中可以列出 INSERT、UPDATE 或 DELETE 等任何事件。 NOT FOR REPLICATION: 此选项表示 SQL Server 在作为复制过程一部分修改数据时不会执行触发器。 SQL_Statements: 它包含一个或多个 SQL 语句,用于在发生事件时执行操作。 何时使用触发器?当我们需要根据期望的条件自动执行特定操作时,触发器非常有用。例如,我们必须了解正在不断变化之中的数据库的更新频率和时间。在这种情况下,我们可能会设计一个触发器,在主表发生更改时将必要的数据插入另一个数据库。 SQL Server 中的触发器示例让我们通过首先使用以下语句创建一个名为 'Employee' 的表来了解如何在 SQL Server 中使用触发器。 接下来,我们将像这样在此表中插入一些记录 我们可以使用 SELECT 语句验证插入操作。我们将获得以下输出 ![]() 我们将创建另一个名为 'Employee_Audit_Test' 的表,以自动存储 Employee 表上的每个操作(如 INSERT、UPDATE 或 DELETE)的事务记录。 现在,我们将创建一个触发器,该触发器将 Employee 表上的每个插入操作的事务记录存储在 Employee_Audit_Test 表中。我们将在下面使用以下语句创建插入触发器。 创建触发器后,我们将尝试将以下记录添加到表中 如果没有发现错误,请执行 SELECT 语句以检查审计记录。我们将获得以下输出 ![]() 我们将创建另一个触发器,将 Employee 表上的每个删除操作的事务记录存储在 Employee_Audit_Test 表中。我们可以在下面使用以下语句创建删除触发器。 创建触发器后,我们将从 Employee 表中删除一条记录 如果没有发现错误,它将显示以下消息 ![]() 最后,执行 SELECT 语句以检查审计记录 ![]() 在这两个触发器代码中,您会注意到这些行 这里 inserted 和 deleted 是 SQL Server 使用的特殊表。当您在实际表中插入新行时,inserted 表会保留该行的副本。而 deleted 表会保留您刚从实际表中删除的行的副本。 SQL Server 触发器的类型我们可以将 SQL Server 中的触发器主要分为三种类型
![]() DDL 触发器CREATE、ALTER 和 DROP 语句等 DDL 事件会导致 DDL 触发器触发。根据 DDL 事件的类型,我们可以在服务器或数据库级别构建这些触发器。此外,它还可以响应系统建立的执行类似 DDL 任务的某些存储过程。 在以下情况下,DDL 触发器会很有用
DML 触发器DML 触发器响应用户表或视图中的 INSERT、UPDATE 和 DELETE 语句等 DML 事件而触发。它也可以响应系统定义的存储过程执行的类似 DML 的操作而触发。 DML 触发器可分为两类
![]() 后置触发器在 SQL Server 成功完成触发操作后,触发该操作的触发器才会触发。通常,当表完成插入、更新或删除操作时,会执行此触发器。它不支持在视图中使用。有时也称为 FOR 触发器。 我们可以将此触发器进一步分为三类
![]() 示例:当我们向表中插入数据时,直到行通过所有约束(如主键约束)后,与该表插入操作关联的触发器才会触发。SQL Server 在数据插入失败时无法触发 AFTER 触发器。 下面是 SQL Server 中 After Triggers 语法的说明 Instead of 触发器Instead of 触发器在 SQL Server 开始执行触发它的触发操作之前触发。这意味着在触发器运行之前不需要进行任何条件约束检查。因此,即使约束检查失败,此触发器也会触发。它与 AFTER 触发器相反。我们可以创建在表上执行成功但未包含表实际插入、更新或删除操作的 INSTEAD OF 触发器。 我们可以将此触发器进一步分为三类
![]() 示例:当我们向表中插入数据时,与该表插入操作关联的触发器将在数据通过所有约束(如主键约束)之前触发。SQL Server 也会在数据插入失败时触发 Instead of Trigger。 下面是 SQL Server 中 Instead of Triggers 语法的说明 登录触发器响应 LOGON 事件的触发器称为登录触发器。每当用户会话在完成登录认证过程但用户会话建立之前,与 SQL Server 实例建立会话时,就会触发 LOGON 事件。因此,触发器生成的任何消息(包括错误和 PRINT 语句消息)都将显示在 SQL Server 错误日志中。登录失败时,登录触发器不会激活。通过记录登录行为或限制某个登录的会话数量,这些触发器可用于审计和管理服务器会话。 如何在 SQL Server 中显示触发器?当我们有多个数据库和多个表时,显示或列出触发器非常方便。当多个数据库中的表名相同时,此查询非常有帮助。使用以下命令,我们可以查看 SQL Server 中所有可用触发器的列表 如果我们使用 SQL Server Management Studio,则非常容易显示或列出任何特定表中的所有可用触发器。我们可以通过以下步骤完成此操作
在这里,我们将看到各种选项。当我们选择触发器选项时,它会显示此表中所有可用的触发器。 ![]() 如何在 SQL Server 中更新触发器?表中的数据会随着时间的推移而改变。在这种情况下,我们也需要对触发器进行更改。我们可以在 SQL Server 中通过两种方式完成此操作。第一种是使用 SQL Server Management Studio,第二种是使用 Transact-SQL 查询。 使用 SSMS 修改触发器首先,打开 Management Studio 以修改触发器。然后,转到存储触发器的数据库,然后转到表。现在,右键单击您要更改或更新的触发器。这将打开上下文菜单,您将在其中选择修改选项。 ![]() 选择修改选项后,您将看到一个新的查询窗口,其中自动生成了 ALTER TRIGGER 代码。我们可以根据需要进行更改。 ![]() 使用 SQL 命令修改触发器我们可以使用 ALTER TRIGGER 语句修改 MS SQL 中的触发器。以下语句允许我们对触发器进行修改 如何在 SQL Server 中删除触发器?我们可以使用 DROP TRIGGER 语句删除 SQL Server 中的现有触发器。删除触发器时必须非常小心。因为一旦删除了触发器,就无法恢复。如果找不到触发器,DROP TRIGGER 语句将引发错误。 以下语法删除 DML 触发器 如果我们想一次删除多个触发器,我们必须使用逗号分隔触发器。 我们可以使用以下格式的 DROP TRIGGER 语句删除一个或多个 LOGON 触发器。 我们可以使用以下格式的 DROP TRIGGER 语句删除一个或多个 DDL 触发器。 如果我们使用 SQL Server Management Studio,它使得从表中删除触发器变得非常容易。我们可以通过以下步骤完成此操作
此选项显示此表中所有可用的触发器。现在,右键单击任何您想删除的特定触发器,然后从下拉菜单中选择删除选项。 ![]() 触发器的优点以下是使用 SQL Server 中的触发器的优点
触发器的缺点以下是使用 SQL Server 中的触发器的缺点
SQL Server 触发器上的选择题1. 一种独特的 __________ 过程称为触发器。
答案:b 解释:触发器与 DDL 和 DML 语句一起用于在修改数据之前或之后分析和评估数据。 2. 请说明以下哪个陈述是正确的。
答案:c 解释:触发器提供了一类特殊的存储过程,它在与它关联的 DDL 或 DML 语句执行时自动启动。 3. SQL Server 支持多少种不同的触发器?
答案:d 解释:我们可以在 SQL Server 中创建四种不同类型的触发器。数据操作语言 (DML) 触发器、数据定义语言 (DDL) 触发器、CLR 触发器和登录触发器。 4. _ _ _ _ _ _ _ _ 可与 SQL Server 的 AFTER 触发器一起使用。
答案:d 解释:当 SQL Server 成功完成触发它的操作后,AFTER 触发器会激活。 5. 以下哪个 SQL Server 应用程序可以使用 DML 触发器?
答案:a 解释:我们可以创建在 SQL Server 中执行类似 DML 的操作的存储过程,以及对 DML 语句(如 INSERT、UPDATE 和 DELETE)的触发器。 下一个主题SQL Server CAST |
我们请求您订阅我们的新闻通讯以获取最新更新。