背景:个人版机房收费系统完事后,接下来应该是合作版的机房收费系统,但是迟迟没有开始,最近才打算合作,“迟迟没有开始”的时间用来学习牛腩新闻发布系统了,也算是时间的合理分配利用吧!刚刚开始的,比较容易上手,因为之前用VS重构了机房收费系统,对VS有亲切感,再加上牛腩老师幽默风趣,到目前为止,学习牛腩新闻发布系统是很有乐趣的。11集的时候,牛腩老师使用了触发器,之前听说过,但是没有实践,现在来实践一下,也算是还上“欠下的债”吧!
一、What?
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作( insert,delete,update)时就会激活它执行,触发器经常用于加强数据的完整性约束和业务规则等。其实往简单了说,就是触发器就是一个开关,负责灯的亮与灭,你动了,它就亮了。
SQL Server中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。
DML触发器分为:
1、after触发器(之后触发)insert触发器,update触发器,delete触发器
2、instead of 触发器 (之前触发)
其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插入表(inserted表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。
二、一张小图
三、How?
1、找到想要建立触发器的表,然后右击——〉新建触发器
2、显示下面的代码界面
3、建立自己想要实现的触发器功能[删除类别(其下的新闻和新闻评论一起删除)]
因为表与表之间有外键的联系,删除的时候容易出错,除了用存储过程来解决这个问题,还可以用触发器。
4、新建查询——〉delete from category where id=15——〉执行
5、在VS中添加代码:
(1)、CategoryDAO
/// <summary> /// 删除类别(连同其下的新闻及新闻评论一起删除) /// </summary> /// <param name="id">类别ID</param> /// <returns></returns> 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); if (res > 0) { flag = true; } return flag; }
protected void Button1_Click1(object sender, EventArgs e) { string id = TextBox1.Text; string caName = TextBox2.Text; bool b = new CategoryDAO().Delete(id); Response.Write (b); GridView1.DataSource = new CategoryDAO().SelectAll(); GridView1.DataBind(); }
哒哒哒~~~~删除成功... ...
四、收获
之前一点都不想了解触发器,因为潜意识的给它定位:有点难,后期学习的时候再说吧!一拖再拖,终于拖不下去了,学习牛腩老师的视频,自我感觉,其实没有想象中的那么难,这不,轻轻松松就学会了嘛!
其实,学习就是这样,困难的不是困难本身,而是你自己没有下定决心去解决困难!