背景
真正听说触发器这个词也是很早了,初次接触数据库的时候就接触到这个词了,但是并没有真正使用过,只是停留在知道的阶段。很开心牛腩学习的时候用到了,牛腩老师讲的很好,学习到了很多。
what?
1. 触发器(trigger)是特殊的存储过程,他的执行不是由程序调用,也不是手工启动,而是由时间来触发。当对一个表进行操作(insert,delete,update)时就会激活它的执行,触发器经常用于加强数据的完整性约束和业务规则等。
2.分类:
(1)DML触发器:after触发器(之后触发):insert触发器,update触发器,delete触发器;instead of触发器(之前触发)
(2)DLL触发器:create,alter,drop
how?
那么到底它是如何使用的呢?
1.找到想要建立触发器的表,依次点击新建触发器
2. 然后就可以看到数据库已经建立好的触发器模板,我们只需要根据自己的实际需要去修改相应的部分即可。
3.牛腩中是根据删除新闻类别一起删除类别下的新闻和评论建立的触发器:
USE [newsystem]
GO
/****** Object: Trigger [dbo].[trigCategoryDelete] Script Date: 11/18/2017 14:13:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: 杨光彩
-- Create date: 2017-10-1 08:15:31
-- Description: 删除类别触发器
-- =============================================
ALTER TRIGGER [dbo].[trigCategoryDelete]
ON [dbo].[category]
instead of delete
AS
BEGIN
--定义id
declare @caId int
--在临时表变量中查找id
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
4.在vs中添加代码:CategoryDAO
//删除类别(连同其下的新闻及新闻评论一起删除)
public bool Delete(string id)
{
bool flag = false;
string sql = "delete from category where id=@id";
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter("@id",id )
};
int res = sqlhelper.ExecuteNonQuery(sql, paras,CommandType.Text );
if (res > 0)
{
flag = true;
}
return flag;
}
与存储过程比较
触发器不能用execute语句调用,而是用户执行T-SQL语句时自动执行。从上面CategoryDAO的代码我们也可以看出,在代码中我们并没有调用触发器,而是在delete语句执行的时候触发器自动执行。
对于触发器的理解还需要在之后的学习中进一步深入,比如这里还有一个问题小编没有解决:表中的触发器和数据库触发器有什么区别?