Microsoft Sql Server 2008系统中提供了两种强制业务逻辑和数据完整性的机制,即约束技术和触发器技术。
触发器的概念及类型
一般地认为,触发器是一种特殊的存储过程,它包含大量的Transact-SQL语句。但是存储过程与触发器还是有一些不同,存储过程可以由用户直接调用执行,而触发器不能被直接调用,只能自动执行。
按照触发事件的不同,可以把触发器分为两种,即DML触发器和DDL触发器。
DML触发器类型
1.按照触发事件的类型,可以把Microsoft SQL Server 2008提供的DML触发器分为三种类型:分别是INSERT类型、UPDATE类型、DELETE类型,这些也是DML触发器的基本类型,顾名思义,INSERT类型,就是往表中插入数据时,触发的触发器。而另为两种,同理。
2.按照触发器和触发事件的操作时间划分,可以把DML触发器分为ALTER触发器和INSTEAD OF触发器。当INSERT,UPDATE,DELETE语句执行之后才执行DML触发器的操作时,这时的触发器类型是ALTER触发器。ALTER触发器只能用于在表上的定义。如果想使用触发器操作代替触发事件的操作,可以使用INSTEAD OF类型的触发器。也就是说,INSTEAD OF类型的触发器可以代替INSERT、UPDATE、DELETE触发事件的操作。INSTEAD OF触发器可以建立在表上也可以建立在视图上。通过在视图上建立触发器,可以大大增强通过视图修改表中数据的功能。
DML触发器的使用
DMl触发器主要的作用是维护行级数据的完整性,而不是返回结果。只所以使用触发器,是因为触发器中可以包含非常复杂的过程逻辑。DML触发器可以实现比约束强制更加复杂的数据完整性。
DML可以一连串的更新数据库中相关表的数据。比如,在school数据库中,teacher表上有一个DELETE类型的触发器,该触发器可以删除其他表中与该表中被删除记录teacher_id相匹配的记录。在触发器中,通过使用teacher_id,在其他的表中定位匹配的行为来执行级联删除操作。
确保复杂的数据参考完整性地方法:
1. 执行操作或级联操作,参考完整性可以在CREATE TABLE语句中,通过使用外键约束定义。当级联删除或必须进行修改时,触发器确保相应操作。
2. 创建多行触发器,当插入、删除、修改多个记录行时,必须使用能过处理多行记录的触发器
3. 自定义错误提示信息。
4. 比较修改前后数据的状态,通过insert、update和delete语句,触发器可以提高参考数据的变化情况。
5. 约束优于触发器检查,如果触发器表上有约束,这些约束是在触发器执行之前检查的,如果触发器操作与约束有冲突,则不执行触发器
6. 表可以有应用于任意操作的多个触发器
7. 表的所有者必须要有执行全部触发器定义中语句的许可。
8. 触发器不应该返回结果集
创建触发器
触发器是一种特殊的存储过程,所以DML触发器的创建存储过程的创建方式很相似。
创建DML触发器的CREATE TRIGGER语句的基本语法形式如下:
CREATE TRIGGERtrigger_name
ON table_name_or_view_name
With ENCRYPTION
{FOR|AFTER|INSTEAD OF}
{[DELETE][,][INSERT][,][UPDATE]}
AS
Sql_statement
解释:
1.trigger_name是触发器的名称
2. table_name_or_view_name指定DML触发器的基表或基视图
3. FOR|AFTER|INSTEADOF用于指定触发器发生的时间,FOR和AFTER作用是相同的
4. [DELETE][,][INSERT][,][UPDATE]指定触发事件的关键字,可以一次指定一个事件、也可以是多个
注意事项:虽然触发器中可以包含许多的Transact-SQL语句,但是,仍有一些语句是不能用在触发器中的
1. CREATE DATABASE、ALTER DATABASE、DROP DATABASE、RESRORE DATABASE等语句
2. 不允许对基表执行修改和删除操作
3. CREATE INDEX、ALTER INDEX、DROP INDEX等
4. RECONFIGURE语句
下面举一些实例进行演示:
我的实例是这样:我有table1和table2两个张表,我想做到:我对当我对table1进行增、删、改记录时,table2能过记录,对table1做的是什么操作还有操作的数是什么,是对哪一条记录做了修改
首先建立两个表table1、table2
1.table1的创建
createtable table1(
[id] intnot null identity(1,1)primary key,
[money] int not null
);
2.table2的创建
create tabletable2(
[id] intnot null identity(1,1)primary key,
[type] varchar(50)not null,
[money] int not null,
[table1_id] int not null
);
创建DML触发器
1. insert类型的触发器
create triggert_table1_insert
ON table1
with encryption
for insert
as
declare @a int
declare @b int
select @a=[money],@b=[id]
from inserted
insert intotable2([type],[money],[table1_id])values ('insert',@a,@b)
go
2. update类型的DML触发器
create triggert_table1_update
ON table1
with encryption
for update
as
declare @a int
declare @b int
select @a=[money],@b=[id]
from inserted
insert intotable2([type],[money],[table1_id])values ('update',@a,@b)
go
同上理,可以自己写下delete类型的DML
测试时很重要:
1. insert测试
insert into table1([money])values ('insert',100)
查看table1和table2表的变化
select* from table1
select *fromtable2
2. update测试
update table1set [money]=400where id=1
查看table1和table2表的变化
select* fromtable1
select *fromtable2
delete类型的可以自己试试写
查看触发器的内容有多种方式:
1. 在对象资源管理器中,点开基表前的小’+’号,就能在下拉菜单中看到触发器的字样
2. 通过SQl命令显示
Exec sp_helptext ‘触发器的名称’go
或
Select * from sys.triggers go
这个可以显示所有的触发器的信息