现在的位置: 首页 > 综合 > 正文

浅入浅出触发器

2013年08月05日 ⁄ 综合 ⁄ 共 3700字 ⁄ 字号 评论关闭

                                                                   浅入浅出触发器(7-11)

 

 

触发器(tigger),触发器是数据库的对象. 是一个特殊的存储过程,他的执行不是由程序调用,也不是手工启动,而是又事件来触发的. 就像是愤怒的小鸟中一连串的动作.我们给小球一个外力,他就会执行一连串的动作,并影响一连串的事件(表的级联操作).还记得<功夫熊猫>里,因为熊猫阿宝的一个包子不小心把师傅的练功房的器械全都发动了.
又如我们的蝴蝶效应(也许比喻不恰当)就像多米诺骨牌,只要一推(事件)就会引发一连串有关的事件,而每个多米诺骨牌又是有联系的.

 

  现在翻开曾今的耿老师,才发现耿老师写的是如此的详细! 在我们的数据库中是当对表进行操作(insert delete update)时就会激活它执行. 触发器经常用于加强数据的完整性约束和业务规则等. 触发器是基于表进行操作,触发器的主要作用是能够实现由主键和外键所不能保证的复杂的参照性完整性和数据一致性.可以级联修改,级联删除,调用存储过程.

百度百科关于触发器:http://baike.baidu.com/view/71792.htm

 

触发器的用途.

 

(1) 强化约束(Enforce restriction)

触发器能够实现比CHECK语句更为复杂的约束。(与check区别很容易查找到)

(2) 跟踪变化Auditing changes

触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。

 

(3) 级联运行(Cascaded operation)。

触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。

(4) 存储过程的调用(Stored procedure invocation)。

为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。

 

 

触发器五种类型:

 

其实我们说触发器,名字听起来就感觉很深的样子,想想也就是我们去建立一个黑盒子,黑盒子外面有一个按钮,按钮就是这个触发盒子运行的事件了,盒子中就是与这个按钮有关系的"多米诺按钮了",可以再有其他的逻辑功能(存储过程), 我们数据库中可以建立这样的四个盒子(触发器).

 

update触发器:  更新操作时触发.

Insert触发器:插入操作时触发.

Delete触发器:删除操作时触发

Instead Of触发器:在表或视图(虚拟表动态生成)重写insert Update 或delete操作. 同一个操作只能执行一个触发器.

After触发器:在一个触发动作发生之后触发,只能在表上定义,可以控制多个触发器的执行顺序.

 

创建一个触发器时,必须指定,触发器名称,在其上定义的表,触发器合适触发,激活触发器数据的修改语句.

在数据库中我们创建一些数据库的对象都是有两种方法的,一种是利用资源管理器,一种是用T-SQL语句,还是有必要把基础语法复习一下的.

 

触发器的创建.

语法

CREATETRIGGER trigger_name 
ON table|view 
[WITH ENCRYPTION] 
{ FOR | AFTER | INSTEAD OF }

{[INSERT][,][UPDATE][,][DELETE]}

AS
 sql_statements [
n] 

 

查看触发器的相关数据

使用系统存储过程sp_helptrigger:语法如下: exec sp_helptrigger table [,type]

触发器的修改:alter

触发器的改名:rename

触发器的删除:drop

在这里就不赘述了,网上有很多的资料.(大水这写的很是详细不再赘述:http://blog.csdn.net/liushuijinger/article/details/7643820

 

 

在这里提一下存储过程.和存储过程进行比较.

存储过程(stored procedure)是一组为了完成特定功能的SQL语句集,经过编译后存储在数据集中,我们在程序中通过指定存储过程的名字,并给出参数来执行它.  无论是触发器还是存储过程都是SQL语句和控制流程语句的结合. 而无论是sql语言还是,其他的计算机语言都是二十六个字母的组合,并且在某个原理上是想通的.   我们数据库中的存储过程更像我们程序中执行特定功能的函数(但我们要知道存储过程和函数是不同的,下篇讲到.).而触发器是特殊的存储过程,就相当于我们在触发一个按钮的click事件时,vs的IDE会自动的给出这个触发的事件.
这个事件只不过是在vsIED自带的,而我们是要在写sql语句的,更加的灵活了,所以说触发器是特殊的存储过程.

数据库这样设计是不但为了提高执行效率,也是为了与其他的编程语言有所区分吧. 可以简单的理解为数据库中的存储过程类似与程序语言中的函数,而触发器类似于程序语言的事件. 

 

 

使用触发器级联实例.

我们要删除一个表的一条记录的同时,为了保证数据的完整性,我们也要把与这个表级联或是间接级联的相应的记录删除. 

就拿牛老师的视频中所说的新闻类别表和新闻表来说吧,我们在数据库中执行一条删除新闻类别的操作,删除不成功弄个,并会给出相应的提示 ,"DELETE 语句与 REFERENCE 约束"FK_news_category"冲突。该冲突发生于数据库"newsSystem",表"dbo.news",column 'caId'。   " 问题的解决.

使用触发器,在触发删除类别表的同时触发事件,同时删除与该表有约束关系的相应的表的记录.

 

我们在数据库的要在哪个表(哪个表定义触发器)的节点下面可以看到触发器,右键新建数据库触发器. 

我们的数据查询窗口就会显示系统自带的触发器的模版代码.我们在模版这开始更改,模版示例中包括开始的注释,我们为哪个数据库创建的触发器, 开始新建触发器的判断,判断是否已经存在同名的触发器. 之后新建我们的触发器了.

 

after触发器可以是针对自己而言.可以恢复删除的记录.(在这里就不举例了),我们选择用的是insteasd触发器来执行操作.

instead
触发器是当触发一事件时同时触发某一事件,例如,在删除类别表的时候同时显示新闻表中的所有内容.

-- =============================================
-- Author:		HaiFang
-- Create date: 2012-7-11
-- Description:	删除级联触发器
-- =============================================
ALTER TRIGGER [dbo].[trigCateGoryDelete] 
   ON  [dbo].[category] 
   instead of  delete
AS 
BEGIN
 
	select * from news 
END


delete from category where id=1

 

用Instead
触发器和参数传递来执行删除表的操作. 我们删除的顺序是先删除作为外键在的那个表的记录,从底层开始删除.

-- =============================================
-- Author:		HaiFang
-- Create date: 2012-7-11
-- Description:	删除级联触发器
-- =============================================
ALTER TRIGGER [dbo].[trigCateGoryDelete] 
   ON  [dbo].[category] 
   instead of  delete
AS 
BEGIN
    --delete from comment where caId =(select id from deleted )
	--delete from news where caId =(select id from deleted )
	--select * from news 
	--定义删除类别编号的变量.
	declare @caId int 
	select @caId =id  from deleted 
	--删除评论表对应的记录.
	delete comment where newsId =(select newsId from news where caId =@caId )
	--删除新闻表对应的记录.
	delete news  where caId =@caId 
	--删除类别表对应的记录.
	delete category where id=@caId 
	
END

 

再执行删除语句.

delete from category where id=1

就会把有外键约束的相应的记录全部删除了.

 

 

无论是存储过程还是触发器都是在我们的服务器端,从系统的整体出发,我们使用存储过程和触发器,一方面是为了保证数据的完整性和一致性,另一方面是高效率的执行我们的程序,减少我们客户端的压力,把压力部分分给我们的服务器端.但是过多的使用也不好,就会增加服务器的重担,平衡就好.

 

 

 

抱歉!评论已关闭.