牛腩新闻发布系统 (二)认识触发器?

什么是触发器

触发器(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();
        }