触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。 Ø 什么是触发器 触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有creat SQL Server中的触发器是数据库管理系统提供的一种特殊存储过程,它主要功能是在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行。这使得触发器成为实施复杂业务规则和数据库完整性约束的有效工具,特别是在那些标准的SQL语句无法满足需求的情况下。 触发器与存储过程的主要区别在于触发机制。存储过程需要显式调用,而触发器则是由数据库系统在特定数据操作触发后自动执行。例如,当用户尝试向表中插入新数据、更新现有数据或删除数据时,如果表上有相应的触发器定义,那么这些操作会触发触发器的执行。 在SQL Server 2005及更高版本中,触发器主要分为两种类型: 1. DML(Data Manipulation Language)触发器:这类触发器针对DML语句(INSERT、UPDATE、DELETE)触发。它们又分为: - **AFTER**触发器:这些触发器在DML操作完成后执行,可以用来验证或处理操作的结果。 - **INSTEAD OF**触发器:在DML操作执行之前触发,可以替代默认的行为。如果INSTEAD OF触发器定义了,那么原始的INSERT、UPDATE或DELETE操作将不会执行,而是由触发器中的代码来实现。 2. DDL(Data Definition Language)触发器:这类触发器在执行DDL语句(如CREATE、ALTER、DROP等)时触发,用于监控和响应数据库架构的更改。 触发器的工作原理涉及到两个特殊的表:`inserted`和`deleted`。这两个表在内存中临时创建,反映了触发操作前后数据的状态。`inserted`表包含新插入或更新后的数据,而`deleted`表则包含更新前或删除的数据。对于UPDATE操作,`inserted`和`deleted`表都会包含更新后的数据,因为更新实际上是一个“删除旧值”和“插入新值”的过程。这些表是只读的,不能直接修改,但可以用来比较和分析操作前后数据的变化。 创建触发器的语法如下: ```sql CREATE TRIGGER tgr_name ON table_name WITH encryption --可选,用于加密触发器 FOR|AFTER|INSTEAD OF {INSERT|UPDATE|DELETE}... AS BEGIN -- 触发器的Transact-SQL代码 END; ``` 以下是一些示例: - **创建INSERT触发器**:在新的记录被插入到`classes`表后,触发器会自动插入一条新的记录到`student`表。 ```sql IF (OBJECT_ID('tgr_classes_insert', 'tr') IS NOT NULL) DROP TRIGGER tgr_classes_insert; GO CREATE TRIGGER tgr_classes_insert ON classes FOR INSERT AS BEGIN -- 定义变量并查询inserted表中的数据 DECLARE @id INT, @name VARCHAR(20), @temp INT; SELECT @id = id, @name = name FROM inserted; SET @name = @name + CONVERT(VARCHAR, @id); SET @temp = @id / 2; -- 插入新的学生记录 INSERT INTO student VALUES(@name, 18 + @id, @temp, @id); PRINT '添加学生成功!'; END; GO ``` - **创建DELETE触发器**:在从`classes`表中删除记录时,触发器会将被删除的记录备份到`classesBackup`表。 ```sql IF (OBJECT_ID('tgr_classes_delete', 'TR') IS NOT NULL) DROP TRIGGER tgr_classes_delete; GO CREATE TRIGGER tgr_classes_delete ON classes FOR DELETE AS BEGIN PRINT '备份数据中……'; IF (OBJECT_ID('classesBackup', 'U') IS NOT NULL) INSERT INTO classesBackup SELECT name, createDate FROM deleted; END; GO ``` 触发器是数据库设计的重要组成部分,可以确保数据的完整性和一致性。然而,由于其隐含的执行特性,不恰当或过度使用触发器可能会导致性能问题和不易理解的代码。因此,使用触发器时应谨慎,并确保触发器的行为清晰且易于维护。
- 粉丝: 11
- 资源: 953
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助