牛腩新闻发布系统—instead of 触发器
发布日期:2021-06-29 11:15:52 浏览次数:2 分类:技术文章

本文共 1430 字,大约阅读时间需要 4 分钟。

  数据库中的表都是通过主外键联系的,因此它们之间也就有了约束,所以当我们删除一条记录时,如果此条记录的主键是另一张表中的记录的外键时,那么就删除不了。视频中老师说有好几种办法,下面我说一下我了解的三种方法 。

第一种:将删除规则改为级联操作

  1. 打开数据库中的数据库关系图

在这里插入图片描述
  2. 修改 Insert和Update规范
在这里插入图片描述
  首先点击两张表之间的关系,修改右边的删除规则为“级联”。这时再删除,就可以顺利删除了。

第二种:存储过程

  这种方法也很简单,就是利用存储过程,不过删除语句有严格的顺序关系。比如新闻类别下有新闻,新闻下有评论,如果我们想删除一个新闻类别时,就要先删除评论,再删除新闻,最后才能删除新闻类别。

第三种:instead of 触发器

  由于我之前对触发器接触的不深,所以这种方法对我来说也算是一个新知识。以前只用过 after 触发器,after触发器是在执行完某个动作之后才会自动触发的。而对于上述情况的话,如果用这种触发器就解决不了我们的问题,因为after触发器是删除完新闻类别触发的,但是我们现在无法删除新闻类别。

  这时我们就可以利用 instead of 触发器,instead of 顾名思义就是“替代”的意思。这种触发器并不会执行实际的操作语句,而是用触发器执行的操作去替代实际要做的操作。
  下面来看一个例子:

USE [newssystem]GO/****** Object:  Trigger [dbo].[trig_category_delete]    Script Date: 2019-01-06 20:53:12 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- ======================================================--Author:      
--Create date: <2019-01-05 10:41>--Description: 删除新闻类别触发器-- ======================================================ALTER TRIGGER [dbo].[trig_category_delete] ON [dbo].[category] INSTEAD OF DELETEASBEGIN declare @caId int select @caId = id from deleted --删除评论 delete from comment where newsId in (select newsId from news where caId = @caId) --删除新闻 delete from news where caId = @caId --删除新闻类别 delete from category where id=@caIdEND

  先介绍一下inserted表和deleted表,具体看下图。

在这里插入图片描述
  看上面的代码,这是一个删除触发器,但是当我们从新闻类别表中删除一条记录时,并没有立即把它删除,而是先把要删除的记录存储在 deleted 这张临时表中,然后去执行 BEGIN 下面的 SQL 语句,这些语句也是有严格的删除顺序的,即先删除评论,再删除新闻,最后删除新闻类别。

转载地址:https://blog.csdn.net/zwj_jyzl/article/details/85952543 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:牛腩新闻发布系统—Page.IsPostBack属性
下一篇:机房合作总结

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月28日 05时09分34秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

VC工程从Win32环境往Win64环境迁移的经验总结 2019-04-29
VS报错error C2872:“IXMLDOMDocumentPtr”为不明确的符号? 2019-04-29
JNI内存泄露处理方法汇总 2019-04-29
由C++的dll生成JNI的dll实例--详细步骤(使用vs2015生成dll,使用命令行生成) 2019-04-29
Linux下链接动态链接库时注意 2019-04-29
64位CentOS编译32位代码报错:/usr/local/include/gnu/stubs.h:7:27: 错误: gnu/stubs-32.h: 没有那个文件或目录 2019-04-29
Linux下实现动态库so获取自身工作路径(类似Windows下GetModelFileName函数) 2019-04-29
make: *** 没有规则可以创建“XXX.o”需要的目标“/usr/include/gnu/stubs-64.h”。 停止。 2019-04-29
解决:java调用Jni.dll时找不到依赖库的问题(Can't find dependent libraries) 2019-04-29
VS报错:“创建空文档失败” 2019-04-29
VS报错:error MSB8011: Failed to register output. Please try enabling Per-user Redir...... 2019-04-29
VS2015,同一解决方案不同项目如何联调(DLL和EXE) 2019-04-29
lsof命令:查看应用占用句柄数 & lsof 提示没有这个命令的解决方法 2019-04-29
linux system函数是否执行成功判断方法 2019-04-29
undefined symbol问题的查找、定位与解决方法 2019-04-29
JavaScript调用OCX控件,运行时报错:对象不支持“XXX”属性或方法【已解决】 2019-04-29
win10的ie打不开,用注册表解决 2019-04-29
js基本数据类型 2019-04-29
Python:使用PhantomJS将网页保存为长图 2019-04-29
Python:随机生成手机号码 2019-04-29