看到“触发器”三个字我的第一印象就是:一触即发。最开始听说触发器是在耿建玲老师的SQL视频中听到的,当时一听触发器好高大上,时隔一年之久,触发器的面纱渐渐的为我摘下。
什么是触发器:
触发器(trigger):是SQL Server提供给程序员和数据分析员来保证数据完整性的一种方法,他是与表事件相关的特殊的存储过程,他的执行不是由程序调用,也不是手工启动,而是由事件触发的(百度百科)。
以我个人的理解就是:触发器就是一个方法,这个方法中存储着有对表操作的SQL语句。其实触发器也是是特殊的存储过程,只不过触发器需要一个事件来推动它发生。过程有事件过程和通用过程,触发器就属于事件过程。
为什么使用触发器:
因为触发器是特殊的存储过程,那么他必然也带有一些存储过程的优点。对于多表的复杂操作,他可以将这个复杂的操作进行封装。同时还有一点点的不同就是,触发器可通过数据库中的相关表实现级联(主键,外键)更改。这样就会带来很多省事的地方。
如何使用触发器:
一下举一个在牛腩中的例子。删除类别,同时将此类别下的新闻,评论都要进行删除。
SQL
USE [newssystem]
GO
/****** Object: Trigger [dbo].[triDelete] Script Date: 09/07/2014 14:29:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[triDelete]
on [dbo].[category]
instead of delete
AS
BEGIN
declare @caId int
select @caId=id from deleted
---删除评论
delete comment where newsId in(select newsId from news where caId =@caId )
----删除新闻
delete news where caId =@caId
----删除类别
delete category where id =@caId
END同时还要注意的是,虽然触发器和存储过程很相像,但是触发器的建立离不开表,而存储过程的建立需要建立在库下。
在D层代码:
/// <summary>
/// 删除类别(连同旗下的新闻以及新闻评论一起删除)——用到触发器
/// </summary>
/// <param name="id">只要说删除第几个就OK了</param>
/// <returns>返回Boolean型</returns>
public Boolean Delete(string id)
{
bool flag = false;
string cmdText = "delete * from category where id=@id";
SqlParameter[] paras = new SqlParameter[]
{
new SqlParameter ("@id",id )
};
int res = sqlhelper.ExecuteNonQuery(cmdText, paras, CommandType.Text);
if (res > 0)
{
flag = true;
}
return flag;
}在U层中要给一个事件,比如说Click事件去触发这个方法的实现。这里就不展示U层代码,实际上在D层的代码没有改变,依旧是一个删除语句,不同的就是在SQL中的触发器的语句。
通过上次写的存储过程的D层代码以及本次的触发器的D层代码,我们可以发现存储过程中俄cmdText这个链接字符串知识一个存储过程的名称,而触发器的却是和普通的SQL增删改语句相同的语句。这应该就是百科上的那句话:触发器和存储过程唯一区别是触发器不能执行Execute语句调用,而是在用户执行Transaction—SQL语句时自动触发执行。
触发器的功能很强大,但是我们还是要谨慎的使用,如果各个地方都用到了触发器,这样会破坏数据的结构,给后期的维护都会带来不便。
触发器是一种保证数据完整性的方法,它在数据库事件发生时自动执行。简单来说,触发器就是在特定事件(如表操作)驱动下执行的一系列SQL语句。在牛腩新闻发布系统中,当删除类别时,触发器能同时删除该类别下的新闻和评论,实现了级联删除。尽管触发器功能强大,但过度使用可能破坏数据结构,增加后期维护难度。
354





