• 【SQL触发器】类型 FOR 、AFTER、 Instead of到底是什么鬼


    前言:
    上一篇博客(博客连接:https://blog.csdn.net/jerry11112/article/details/82924714 讲述了触发器的基本概念,触发器什么时候用,为什么用!这篇博客将简述触发器的类型,由于FOR触发器与AFTER触发器是一个作用,所以触发器分为AFTER触发器,与Instead of 触发器!

    为了让大家明白触发器,我先把我的数据库是干嘛的给大家介绍一下吧,我的数据库是一个新闻发系统对应的数据库 ,里边有两个表一个是新闻类别表caregory ,还有一个是新闻表news,其中一条类新闻对应多条新闻,但是一条新闻只是属于一类!故有下图!其中news表的主键为id,外键为caID,与care gory的主键相对,此时通过主外键将两个表连接起来!

    接下来我们要完成的操作是删除表中一条新闻类别信息,我们此时建立一条delete触发器,通过这个触发器我们来了解一下AFTER触发器与instead of 触发器之间到底有何区别!

    1、AFTER(for)触发器 (操作后)
    after触发器是指在操作成功后,所采取的一些动作!

    比如:下面是我创建好的一个after触发器

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    creat trigger [dbo].[T_CaregoryDelete]          --触发器的名字为T_CaregoryDelete
    on [dbo].[caregory]                                         --是caregory类别表的触发器
    after delete                                                     --after代表执行删除后执行as后边的语句
    as
      begin
        delete news where caId=(select id from deleted)      --激发触发器后我要执行的动作,其中deleted是一个系统默认临时表
      end

    接下来我编译代码
    delete from caregory where id=4,报了如下的错误!

    刚才我说过了,我们的类别表caregory与新闻表news表是通过主外键连接的,我们在执行语句delete from caregory where id=4的时候我们的news表对应的新闻也应该被删除!如下所示图!

     

     

    但是我们的after触发器只能是在执行完delete操作后执行,如果此时我们执行
    delete from caregory where id=4 ,那么我们将我们id信息为4的类别的新闻删除后才可以触发触发器,那么我们的这类新闻下的所有新闻就不能被删除了,这时候我们的表是主外键连接的,所以就报了上述错误!那么这下该怎么办呢,这时候解决instead of 触发器登场!

    2、instead of 触发器
    对数据的操作只是一个“导火索”而已,真正起作用的是触发器里面的动作;往往这种触发器会有很多分支判断语句在里面,根据不用的条件做不同的动作!

    INSTEAD OF 触发器用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。如正确才进行相应的操作。因此,INSTEAD OF 触发器的动作要早于表的约束处理。

    真正起作用的是触发器里面的动作,接下来是对应触发器的代码

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER trigger [dbo].[T_CaregoryDelete]
    on [dbo].[caregory]
    instead of delete
    as
      begin
        delete news where caId=(select id from deleted)
        delete caregory where id=(select id from deleted)
      end

    此时执行语句delete from caregory where id=4,那么我们就成功的将我们类别表信息删除,同时将我们类别表下对应的这类的新闻页一块删除了!

    这里可能有人就有疑问了,算上delete from caregory where id=4 共有三个delete,注意上面我强调了一句话,真正起作用的是触发器里面的动作!

    后记:
    after触发器是在操作成功后,所采取的一些动作
    而对于instead of触发器,真正起作用的是触发器里面的动作!

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    函数参数的讨论
    redirect-windows-cmd-stdout-and-stderr-to-a-single-file
    rust 多文件工程
    rust: 默认初始化,函数重载
    VSCode如何格式化所有文件
    FLV协议5分钟入门浅析
    WebRTC:数据传输相关协议简介
    WebSocket协议:5分钟从入门到精通
    Nodejs进阶:crypto模块中你需要掌握的安全基础知识
    前端进阶之路:如何高质量完成产品需求开发
  • 原文地址:https://www.cnblogs.com/jijm123/p/15387180.html
Copyright © 2020-2023  润新知