4. SQL -- 触发器

触发器

触发器是一类特殊的存储过程.它与表的关系密切,用于保护表中的数据,当有操作影响到触发器保护的数据时,触发器自动执行,例如使用触发器实现多个表间数据的一致性.

一般情况下,对表数据的操作有插入,修改,删除,因而维护数据的触发器也可分为三类:

INSERT,UPDATE和DELETE

一、使用SQL命令创建触发器

语法格式如下:

Create trigger tigger_name on {table|view}             --指定触发器的名称和操作对象

[with encryption]                                                               --是否使用加密方式

{{{for|after|instead of} {[delete[,][insert][,],[update]]—定义触发器的类型

[not for replication]                                                          --说明该触发器不用于复制

As

[{if update(column)[{AND|OR} update(column)]

[…n]

|if(columns_update(){ bitwise_operator } updated_bitmask)

{comparison_operator } column_bitmask [..n]}]   --两个if语句用来说明触发器执行的条件

Sql_statement […n]                                                          --一条或若干条sql语句

}}

说明:

(1)     Table | view指在其上执行触发器的表或视图

(2)     After关键字用于说明触发器在指定操作都成功执行后触发,after是默认设置,不能在视力上定义after触发器

(3)     If update(column)子句用于测试在指定的列上(column)上进行的insert或update操作不能用于delete操作,返回值为true或false

(4)     If(columns_update())子句用于测试是否插入或更新了指定的列,返回二进制位数据,若为0没有成功更新,若为1,更新成功

(5)     Bitwise_operator为用于比较去处的位运算符.update_bitmask的值为整型的位屏蔽码,与实际更新或插入的列对应.例如表t 包含列C0,C1,C2,C3和C4.假定该表上有update触发器,若要检查列C0,C2,C4是否都有更新,可指定update_bitmask的值为00010101(即0x15);若要检查是否只有列C1有更新,可指定updated_bitmask的值为00000010

(6)     Comparison_operator为比较运算符;columns_bitmask为列屏蔽友,用来检查是否已更新或插入对应列

(7)     Sql_statement为触发器的SQL语句,当执行delete,insert或update时,对应的解发器生效.

(8)     N表示触发器可包含多条SQL语句

二触发器中使用的特殊表

执行触发器时,系统创建了两个特殊的逻辑表:inserted表和deleted表

Inserted表:当向表中插入数据时.insert触发器触发执行,新的记录插入到触发器表和inserted表中

Deleted表:用于保存已从表中删除的记录,当触发一个delete触发器时,被删除的记录存放到deleted表中

修改一条记录等于插入一条新记录,同时删除旧记录.对定义了update触发器的表记录修改时,表中原记录移到deleted表中,修改过的记录插入到inserted表中,触发器可检查deleted和inserted表

例:检索deleted,inserted表中的所有记录

Select * from deleted

Select * from inserted

三使用触发器的限制

(1)     Create trigger必须是批处理中的第一条语句,并且只能应用到一个表中

(2)     触发器只能在当前的数据库中创建,但触发器可以引用当前数据库的外部对象

(3)     如果指定触发器所有者名限定触发器,要以相同的方式限定表名

(4)     在同一create trigger语句中,可以为多种操作(如insert或update)定义相同的触发器操作

(5)     如果表中存在外键,不能定义insert和update触发器

(6)     触发器中可指定set语句,执行期间有效,执行完恢复到以前的状态

(7)     触发器中不能指定如下T-SQL语句:

Create database,alter database,load database,restore database,drop database,load log,restore log,disk init,disk resize和reconfigure

(8)     触发器不能有任何结果集返回

四举例

对于student数据库,如果在student_table表中添加或更改数据,则将向客户端显示一条信息

/*使用带有提示消息的触发器

USE master

GO

EXEC sp_addmessage 50021, 10, ‘no update or delete‘,‘us_english‘,false,replace

EXEC sp_addmessage 50021, 10, ‘不能插入或更新‘,‘简体中文‘,false,replace

go

Use student

If exists(select name from sysobjects where name=’reminder’ and type=’tr’)

Drop trigger reminder

Go

Create trigger reminder on student_table

For insert,update

As raiserror(4008,16,10)

消息4008是sysmessages中的用户定义消息,有关创建用户消息的方法看下sp_addmessage存储过程

注意:SQL server 在调用sp_addmessage 时有一个参数@lang是用来指明所需要加入的message的语种的,如果没有指定,则认为是语言是会话的默认语言,如果你安装的是中文版,则一般是中文,而SQL server有强制必须先增加英文的错误信息之后才能增加中文的错误信息,所以必须现增加英文版的错误信息。然后再增加本地语种的错误信息。

使用sp_dropmessag删除sysmessages表中添加的信息。直接delete删除不掉

例如:use master go exec sp_dropmessage 50021

(1)     在数据库student中创建一个触发器,当向student_course_table中插入一记录时,检查该记录的学号在student_table表中是否存在,检查课程号在course_table中是否存在,若都有则插入,否则不执行插入

Use student

If object_id(‘check_trig‘) is not null

Drop trigger check_trig

Go

Create trigger check_trig on student_course_table

For insert

As

If exists(select *

from inserted a

Where a.studentID not in(select b.studentID from student_table b) or

a.courseID not in(select c.courseID from course_table c))

Begin

Raiserror(‘违背数据的一致性‘,16,1)

Rollback transaction

End

(2)     在student数据库的student_course_table表中创建一个触发器,若对学号列和课程列修改,则给出提示信息,并取消修改操作.

通过调用colunms_updated()函数,可快速测试对学号列和课程号列修改所做的更改

Use student

Go

Create trigger update_trig

On student_course_table

For update

As

If(columns_updated() &3)>0

Begin

Raiserror(‘违背数据的一致性’,16,1)

Rollback transaction

End

Go

(3)     Inserted of触发器的设计

如果视图的数据来自于多个基表,则必须使用instead of 触发器支持引用表中数据的插入,更新和删除操作

例如:若在一个多表视图上定义了instead of insert触发器,那视图的值可能允许为空,也可能不为空,若视图某列的值不允许为空,则inset语句必须为该列提供相应的值.

如果视图的列为以下几种情况之一:

1>     基表中的计算列

2>     基表中的标识列

3>     具有timestamp数据类型的基表列

该视图的insert语句必须为这些列指定值,instead of 触发器在构成将值插入基表的insert语句时会指定的值

例:在student数据库中的创建表,视图和触发器,以说明instead of insert触发器的使用

Use student

go

Create table books

(

bookKey int identity(1,1),

bookName varchar(10) not null,

color varchar(10) not null,

computedCol as (bookName + color),

Page int,

)

Go

--创建一个视图,包含基表中的所有列

Create view view2

As

Select * from books

Go

--在view2视图上创建一个instead of insert触发器

Create trigger insteadTrig on view2

Instead of insert

As

Begin

Insert into books

Select bookName,color,page from inserted

End

Go

直接引用books表的insert语句不能为bookKey字段和computedCor字段提供值

--正确的insert语句

Insert into books(bookName,color,page)

Values(‘计算机‘,‘红色‘,100)

--查看结果

select * from books

2计算机红色    计算机红色     100

--不正确的insert语句(就是插入所有列)

Insert into books values(2,‘计算机辅助教程‘,‘红色‘,‘绿色‘,100)

但对于引用view2视力的insert语句为每一列都指定值:例如

--对于view2正确的insert语句

Insert into view2 values(2,‘计算机‘,‘红色‘,‘绿色‘,100)

--查看结果

Select * from view2

2计算机红色    计算机红色     100

3计算机红色    计算机红色     100

在执行视图的插入语句时,虽然将bookKey和computedCor字段的值传递了insertedTrig触发器中,但触发器中的insert语句没有选择inserted表的中bookKey和computedCol字段的值(即你写入的这两个字段的值并不真正插入的,它是由系统自动生成或是计算列) 

五:删除触发器

利用SQL语句琰删除触发器

Drop trigger trigger_name[…n]

时间: 2024-07-29 15:55:04

4. SQL -- 触发器的相关文章

SQL触发器实例(下)

1 基本语法: 2 Create Trigger [TriggerName] 3 ON [TableName] 4 FOR [Insert][,Delete][,Update] 5 AS 6 --触发器要执行的操作语句. 7 Go 8 9 注意: 10 触发器中不允许以下 Transact-SQL 语句: 11 Alter DATABASE ,Create DATABASE,DISK INIT, 12 DISK RESIZE, Drop DATABASE, LOAD DATABASE, 13 L

SQL触发器学习

? 简介 触发器是一种特殊类型的存储过程.触发器分为: DML( 数据操纵语言 Data Manipulation Language)触发器:数据库中表或视图的数据更改时触发,包括insert,update,delete语句 DDL(数据定义语言 Data Definition Language)触发器:表或索引中的create.alter.drop语句. 登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发. ? 优劣 可以强制执行业务规则: Microsoft SQL Serve

SQL触发器实例讲解

定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.       常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: Create Table Student(              --学生表         StudentID int primary key,       --学号         ....        )

SQL 触发器-如何查看当前数据库中有哪些触发器

在查询分析器中运行: use 数据库名goselect * from sysobjects where xtype='TR' sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记录即为触发器对象.在 name 一列,我们可以看到触发器名称. SQL 触发器-创建一个简单的触发器 SQL 触发器-重命名触发器 SQL 触发器-删除触发器 SQL 触发器-触发器更多语法 SQL 触发器-如何查看某个触发器的内容 SQL 触发器-多个触发器 SQL 触发器-递归.嵌套触发器 SQ

创建SQL触发器

我们可以对某个数据表添加SQL触发器,当该表进行添加.更新.删除时执行某项操作.不过SQL触发器如果能不用尽量不用,若在项目后期改动程序波及范围太大,使用SQL触发器可以避免,所以才使用. 数据表dbo.User(UserName, Password) CREATE TRIGGER Trigger_User ON dbo.User FOR UPDATE, DELETE AS IF UPDATE(UserName) BEGIN DECLARE @userNameBeforeUpdate NVARC

【牛腩视频】之SQL触发器

之前在学习机房管理系统.net版的时候,已经写过了关于数据库的操作,但是现在开始学习牛腩,才发现之前自己理解的太浅显,很多东西看似好像会了,不去实际操作一下,不把代码从头到尾敲出来,到头来还是不会,所以,这篇文章就是总结如何从头到尾,创建一个sql触发器的教程.以下均以sql2008r2为例: 第一步:创建触发器 找到自己要创建触发器的表-触发器-新建触发器. 第二步:填写所需要信息 点击新建触发器以后,就会出现数据库为我们创建的一些初始化的代码,如下: 我们需要写的地方就是从CREATE TR

PB+MS SQL+触发器必须注意

PB+MS SQL+触发器必须注意: 若触发器存在两笔以上的返回值,比如两条update 语句,被误判为数据有改变,存盘不成功. 提示: Row changed between retrieve and update. No changes made to database. 所以MS SQL 触发器必须统一处理为: 触发器开始加: [email protected]@ROWCOUNT=0 Return --提高效能 setnocount on --不返回统计笔数,可减少网络频繁响应,提高效性能

SQL触发器中的deleted表和inserted表

SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表用于存储 DELETE和 UPDATE语句所影响的行的复本.在执行DELETE或 UPDATE语句时,行从触发器表中删除,并传输到 deleted表中.Deleted表和触发器表通常没有相同的行. Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本.在一个插入或更新事

PB+MS SQL+触发器必须指出

PB+MS SQL+触发器必须指出: 若触发器存在两笔以上的返回值,比方两条update 语句,被误判为数据有改变.存盘不成功. 提示: Row changed between retrieve and update. No changes made to database. 所以MS SQL 触发器必须统一处理为: 触发器開始加: [email protected]@ROWCOUNT=0 Return --提高效能 setnocount on --不返回统计笔数,可降低网络频繁响应,提高效性能

SQL 触发器

触发器: 触发器为特殊类型的存储过程,可在执行语言事件时自动生效.SQL Server 包括三种常规类型的触发器:DML 触发器.DDL 触发器和登录触发器. 当服务器或数据库中发生数据定义语言 (DDL) 事件时将调用 DDL 触发器.登录触发器将为响应 LOGON 事件而激发存储过程.与 SQL Server 实例建立用户会话时将引发此事件. 当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器.DML 事件包括在指定表或视图中修改数据的 INSERT 语句.UPDATE 语