0引言
触发器是在数据库管理系统中用于监视表的变化并在特定条件下执行相应操作的一种数据库对象,常用于维护数据的完整性、实现业务规则、执行日志记录等方面,用以提高数据库的可靠性和应用的稳定性。
1.触发器种类
在数据库管理系统中,触发器通常可以根据其触发时机和执行次数的不同分为以下几种类型:
- 行级触发器(Row-level triggers):这种触发器是针对表中每一行数据的操作而触发的,包括对单行数据的插入、更新和删除操作。当每一行数据受到影响时,行级触发器都会被激活。
- 语句级触发器(Statement-level triggers):与行级触发器不同,语句级触发器是在SQL语句级别上触发的,它们会在SQL语句执行之前或之后被激活,而不是在每一行数据受到影响时触发。
- BEFORE触发器:这种触发器会在数据操作执行之前被激活,它可以用来在数据写入或更新到数据库之前执行一些检查或操作。
- AFTER触发器:相反,AFTER触发器会在数据操作执行之后被激活,它可以用来在数据写入或更新到数据库之后执行一些后续操作,如记录日志、更新相关数据等。
2. 语句组成
触发器语句通常由以下几个部分组成:
-
触发器名称(Trigger Name):触发器的名称是用来唯一标识触发器的,它必须在数据库中是唯一的。
-
触发时机(Triggering Event):触发器可以在特定的数据库操作时被激活,包括INSERT(插入)、UPDATE(更新)和DELETE(删除)等。
-
触发器类型(Trigger Type):触发器可以是BEFORE触发器(在操作执行之前激活)或AFTER触发器(在操作执行之后激活)。
-
触发器作用的表(Triggering Table):指定触发器所作用的表,即当该表发生特定操作时触发触发器。
-
触发器事件(Triggering Action):指定触发器所要执行的动作,可以是SQL语句块或者调用存储过程。
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE ON table_name
FOR EACH ROW/STATEMENT
BEGIN
-- 触发器要执行的SQL语句块或存储过程调用
END;
在这个语句中,trigger_name
是触发器的名称,BEFORE/AFTER
指定了触发器的类型,INSERT/UPDATE/DELETE
指定了触发时机,table_name
指定了触发器作用的表,FOR EACH ROW/STATEMENT
指定了是行级触发器还是语句级触发器,BEGIN
和END
之间是触发器要执行的SQL语句块或存储过程调用。
3.操作流程
举个例子,在学生管理系统中,在添加学生时,如果学生的专业并不在专业表中或者添加的学生与学生表中已存在学生的学号发生了冲突,这是不允许出现的。因此我们就需要在数据库中设计一个规则,在添加学生并且出现上述情况时阻止继续插入的操作并且给出相应提示。首先,由于我们要插入的是学生表,因此我们需要在学生表中创建一个触发器来阻止操作。语句如下:
USE [TeachingManagermentSystem]
GO
/****** Object: Trigger [dbo].[tri_addstudent] Script Date: 07/04/2024 17:22:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [dbo].[tri_addstudent]
ON [dbo].[StudentInfor]
FOR INSERT,UPDATE
AS
IF(SELECT COUNT(*)FROM MajorInfor,inserted
where MajorInfor.MajorNum=inserted.MajorNum)=0
BEGIN
PRINT'未找到该学生专业的信息,请添加相应专业后重试!'
ROLLBACK
END
ELSE IF
(SELECT COUNT(*) FROM StudentInfor,inserted WHERE StudentInfor.StudentNum=inserted.StudentNUM)>0
BEGIN
PRINT'学号冲突,请核对后重试!'
ROLLBACK
END
下面我们来理解一下,
-
USE [TeachingManagermentSystem]
:指定要在哪个数据库中创建触发器。 -
GO
:SQL Server中用于分隔多个批处理语句的关键字。 -
ALTER TRIGGER [dbo].[tri_addstudent] ON [dbo].[StudentInfor] FOR INSERT,UPDATE
:定义了一个名为tri_addstudent
的触发器,它会在StudentInfor
表上进行插入和更新操作时触发。 -
AS
:表示触发器的定义开始。 -
触发器的主体部分包括两个条件判断:
- 第一个条件判断使用了
IF
语句,检查插入或更新的记录的专业信息是否存在于MajorInfor
表中。如果不存在,则打印消息并执行ROLLBACK
,即撤销当前的插入或更新操作。 - 第二个条件判断使用了
ELSE IF
语句,检查插入或更新的记录的学号是否已经存在于StudentInfor
表中。如果已经存在,则打印消息并执行ROLLBACK
。
- 第一个条件判断使用了
-
PRINT
:用于在触发器中打印消息。 -
ROLLBACK
:用于撤销当前的插入或更新操作。
4.总结
触发器是数据库管理系统中的一种特殊对象,它可以在特定的数据库操作(如插入、更新、删除)发生时自动触发并执行相应的操作,有助于帮助实现数据的自动化处理和约束,但在使用时还需要谨慎考虑触发器的设计和影响。