考试系统--SQL删除不掉数据

来源:互联网 发布:女士西装套裙知乎 编辑:程序博客网 时间:2024/04/27 16:35

          前段时间,有人做实验,在基础系统数据库中添加了一条数据,后来数据不用了,想要删除数据,却发现数据怎么也删除不掉,也不提示,也不报错.删除的时候数据没了,还以为删了,一刷新,发现那条数据它依然还在.就是下图中的123数据

 

          试图删了几次,情况还是一样,不管是右键删除,还是写SQL语句删除,都不管用.尽管还提示影响了一行,但是刷新依然存在.

          后来看着这条语句,觉得也没什么特别的地方,就是IsAvailable好像有点特殊,就将它改为否.再执行了一次SQL删除,发现数据被删了.

          而且在基础数据库的历史表中查询到了123的数据的信息.

          觉得相当神奇,为什么将字段改为否之后,就可以删除.于是再次做实验,这次不想把IsAvailable改为"否",改为"你好",提示,截断字符,所以改成"你",还是提示Check约束.(这里我就想起,上次查资料看到的Check,可以控制一个字段只能输入某几种值,如性别,只能输入"男","女",所以我知道这里是怎么实现的)

        所以只好还是改为"否",然后ActionContent和ActionType字段就自动发生变化了.变为撤销学院信息和标识删除.我觉得好厉害.(当时,从没用过触发器,也没想过触发器,就觉得在数据库里修改,就能又是更新字段又是往历史表里写数据,觉得很神奇,就这点来说我们数据库真的是比不了啊)

 

         所以到这里也就知道,大概是触发器搞的鬼了,但是还是不知道他是怎么搞的鬼.是如何做到的呢?在这个表下面找到了check约束和trigger触发器看了里面的代码,才恍然大悟.代码其他挺好懂,就算看不懂,但是也知道是干什么的.

     首先是对于IsAvailable的check约束,对于IsAvailable,只能输入是,否.

         并且还设置了IsAvailable的值默认就是"是".(以前也知道有这么个功能,但是没用过就忘了)       

         然后是触发器,触发器是两个,名字是[TR_College_US]和[TR_College_D].(内容太长就不贴了)

         首先是更新的触发器,在将IsAvailable修改并改为"否"的时候执行.语句就是如下,

if (Update(isAvailable) and @isAva = '否')

就开始begin,更新ActionContent和ActionType字段的值为撤销学院信息和标记删除,并且更新一堆和TB_College表有关联的表.然后还要把数据写到历史表中.

          而删除的触发器和更新的差不多.执行条件就是执行了删除,并且IsAvailable为"否",然后就是,首先该触发器写了一句话,让我明白为什么明明删除了,但是不管用.因为该触发器代替了删除.

instead of Delete

如果执行删除,但IsAvailable为是,则触发器不执行,所以删除不掉,因为该触发器代替了删除,但是该触发器又没有执行,相当于我的删除什么也没做.

         当执行删除,且IsAvailable为否之后执行,彻底删除学院信息,并且删除和TB_College相关的表的记录,还会把记录写入到历史表中.

         看完之后由衷的觉得真厉害,尽管我们因为触发器的如不好调试,出错不好查找,不知道什么时候会具体执行,而且一旦不小心删除数据,会级联删除掉一堆可能很重要的数据这样的问题,而不建议使用触发器.但是还是觉得好强悍,我不知道的东西太多了.

          路漫漫其修远兮,吾将上下而求索啊.

0 0
原创粉丝点击