牛腩新闻发布系统 (二)认识触发器?
什么是触发器
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法。它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会**它执行。
结合个例子简单说明下:在《牛腩新闻系统》中,如果你想要删除一个新闻类,直接在窗体上输入新闻类是不行的。原因1,你的数据库关系表设置了主键和外键连接,删除了一个连接类,这个关系就会被破坏。你要是想把主键,外键去掉,确实能解决问题,但这样数据结构之间的依赖关系就没法表示出来了。原因2:你的新闻类里面有新闻评论,新闻类删除,新闻评论是删还是不删,这也是个问题。这时当我们使用事件来**“触发器”时,你建立的触发器可以按照先查找要删除的类别,再删除类别里所对应评论表的数据及其他信息,最后再删除这个类的顺序逐步执行。这样既保持了主外键的关系依赖,又可以删除几个同时满足要求的表。
sqlserver 2014如何建立触发器
一般来说找到数据库中你所要建立触发器的表,再邮件触发器选择新建触发器,可是sqlserver 2014不支持咯
这时你就需要手动建立触发器了。首先,鼠标选中你要建立触发器的表,在工具栏中单机新建查询
然后请按照如下格式输入新建触发器的代码。如果读者不太能理解注释的意思,可以参考牛腩老师的视频第11讲,对代码进行编写。
--Author(作者):
--Create Date(时间):
--Description(名称):
CREATE TRIGGER [触发器名称] --建立触发器的名称
on [表名称] --选择要建立触发器的表
AFTER INSERT/DELETE/UPDATE --触发条件 插入/删除/更新(任选一个)
AS --伴随
BEGIN --开始执行
SQL语句(select * from deleted) --此处填写触发器要执行的SQL语句(比如,查找刚刚执行删除的内容)
... --“...”表示可以是多行
END --结束
GO --
在牛腩系统中,上图中的AFTER应该改成INSTEAD OF
笔者生成代码参考
USE [newssystem]
GO
/****** Object: Trigger [dbo].[trigCategoryDelete] Script Date: 2018/10/14 20:28:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Author(作者):
--Create Date(时间):
--Description(名称):
ALTER TRIGGER [dbo].[trigCategoryDelete] --建立触发器的名称
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 [email protected])
delete news where [email protected]
delete category where [email protected]
END --结束
写完后并确保你程序的界面里编写了如下代码,就可以实现功能喽!
protected void Button1_Click(object sender, EventArgs e)
{
string caName = TextBox1.Text;
string id = TextBox2.Text;
Category ca = new Category(id, caName);
bool b = new CategoryDao().Delete(id);
Response.Write(b);
GridView1.DataSource = new CategoryDao().SelectAll();
GridView1.DataBind();
}