位置: 编程技术 - 正文

sqlserver 触发器教程(sqlserver 触发器 redis)

发布时间:2024-02-26
主类别表名:Navtion_TopSubject 主键fTopID Char() 次类别表名:Navtion_NodeSubject 外键同上 内容表名:tText 外键同上 一、背景 这是我写的一个文章处理系统,分类级别为两级,就是说有两级目录类似这种: 新闻 -->国内新闻 -->国际新闻 教程 -->Asp教程 -->C#教程 -->Jsp教程 下载 -->工具下载 -->源代码下载 每个文章都属于上面的目录下的一个。 这样看,数据库内必须有三个表:主类别表、次类别表、文章内容表。而且,我为了保证数据的完整性,使用了关系(懂SQL Server的知道),这样,假设新闻类下有子类并且每个子类下有文章的话,使用Deltee语句删除类将出现错误,因为违反了数据完整性约束,把类别删除后所属的记录将变为死记录。所以删除主表的记录必须保证这个类别所包含的子类别和内容全部删除。我写的这个触发器的作用就是删除主表类别的触发器,可以在主表类别下有内容的情况下删除主表的记录。 二、数据库结构 1.主类别表 表名:Navtion_TopSubject 主健:fTopID 数据类型:Char 大小: 类别名: fTopName 数据类型:VarChar 大小: 2. 次类别表 表名:Navtion_NodeSubject 主键:fNodeID 数据类型:Char 大小: 外键:fTopID 数据类型:Char 大小: (表示此记录所属的主类别) 类别名:fNodeName 数据类型:VarChar 大小: 3. 内容表: 表名:tText 主键:fID 数据类型:Char 大小: 外键1:fTopID 指向主类别表 表示所属的主类别 外键2:fNodeID 指向次类别表,表示所属的次类别 三、操作流程 1. 这个触发器放在主类别表Navtion_TopSubject中,触发条件是Delete语句,如果对这个表执行了删除命令的话,那么将触发此代码的运行。 2. 定义触发器接受传递过来的Delete语句,然后根据这个语句来执行代码。 3. 标准SQL删除代码如下: DELETE From Navtion_TopSubject Where fYopID = 'aaa' (假设要删除的主类别是新闻,主键编号是aaa) 4. 这样我们就可以利用这个aaa来查找次类别表和内容表是否有所属的内容。 5. 利用deleted表,这个表是逻辑删除表,相当于Windows系统里面的回收站。Sql Server系统定义:如果一个表里面有触发器,那么任何操作都不直接进行,而是进行逻辑操作。这个操作在Inserted表(插入),Updated表(更新),Deleted表(删除)中进行。就拿Deleted表来说,传递到Sql Server系统中的Del命令,如果有触发器的话,Sql首先复制这个要删除的记录到Deleted表中(这个表是个临时表,只能给触发器用,触发器运行结束后自动删除),我们就可以用此代码: Select fTopID From deleted 获得传递到Sql的表Navtion_TopSubject中记录为aaa的主键内容。 6. 把这个主键内容存放到变量中,根据这个变量找次类别表,如果没有内容,表示此记录没有任何次类别和文章,可以直接删除。 7. 如果次类别表中有内容,那么再用这个变量找内容表中属于aaa的内容,如果有,就删除,再删除次类别表的内容,如果没有,则直接删除次类别表的内容。 8. 当次类别表和内容表的记录全部删除干净后,删除主类别表的内容。 四、流程定义 先查找子类别的数量,赋值给@NodeCount变量,然后判断 如果>0 则根据@fTopID找tText表的内容赋值给@fTextCount,如果>0则 首先删除tText表符合@fTopID内容的所有记录 然后删除子类别表Navtion_NodeSubject表中符合@fTopID的所有内容 最后删除主类别表Navtion_TopSubject中符合@fTopID的所有内容 否则 首先删除Navtion_NodeSubject子类别表中符合@fTopID的所有内容 然后删除主类别表Navtion_TopSubject中符合@fTopID的所有内容 否则 仅删除主类别表Navtion_TopSubject中符合@fTopID的所有内容 五、代码解释 CREATE TRIGGER [RemoveTopAndNodeText] ON [dbo].[Navtion_TopSubject] INSTEAD OF DELETE AS 上面的代码是建立触发器的Sql语句,内容: CREATE TRIGGER T-SQL关键字,表示是一个触发器 [RemoveTopAndNodeText] 是触发器的名称 [dbo].[Navtion_TopSubject] 表示这个触发器属于的表的名称 INSTEAD OF 表示这个触发器将屏蔽传递进来的Sql命令,转向执行触发器的命令 (多说一句:除了INSTEAD OF关键字,还有 For关键字,表示这个触发器在执行完传递进来的Sql语句后执行触发器内容,一般用在Insert和Update中) DELETE : 表示此触发器的触发条件是Delete命令,如果对这个表作删除操作,将执行这个触发器的代码。 As 表示下面的代码是触发器的代码: ------------------------------------------------------------------- /* 定义触发器使用的变量 */ DECLARE @fTopID Char, @fNodeCount Int, @fTextCount Int, @fTopName VarChar 以上命令是定义触发器使用的变量,DECLARE 命令相当于VBScript的Dim命令,不过这个语句可以定义多变量,不用一个变量一个命令,变量之间用英文逗号分隔。 @fTopID 是变量名,SqlServer规定,在SqlServer中使用的变量名前面必须加入@字符。 变量后面是变量类型 Char是固定长度的字符串,Int是整数数字类型,VarChar是可变长度的字符串。 -------------------------------------------------------------------------- /* 把传送的需要删除的fTopID键值赋值给@fTopID变量 */ /* 开始事务 */ BEGIN TRAN Remove_TopSubject Set @fTopID = (Select fTopID From deleted) /* 保存删除前保存点,防止出错 */ Save Tran my_Save1 以上代码解释: 放在 /* 和 */之间的是程序注释,类似于Html里面的<!-- 和--> BEGIN TRAN Remove_TopSubject 表示开始事务,其中RemoveTopSubject是事务名称。 事务就是保证操作成功的一种机制,如果在事务里面出错,那么事务将回滚,不会影响整个系统。 举个例子,如果在事务里面定义了3个操作a b c,分别是a 插入一条记录,b 删除一条记录,c 更新一条记录。程序开始执行,如果a 执行成功后开始操作b,b操作出现错误,那么事务开始回滚,插入记录的a将会取消,返回到没有执行这3个操作之前的状态。 Set @fTopID = (Select fTopID From deleted) 这个是Sql Server的赋值命令,把变量@fTopID的值保存成deleted表中fTopID字段的内容。 Set @fTopName = (Select fTopName From deleted) 同样的赋值命令,把要删除的主类别的名称赋值给@fTopName变量,在后面的出错语句用。 Save Tran my_Save1 Save Tran表示保存事务,如果发生错误,则可以用这个保存来恢复。类似于游戏里面的存盘文件。my_Save1是保存名,相当于存盘文件名。 接上: Set @fNodeCount = (Select Count(*) From Navtion_NodeSubject Where Navtion_NodeSubject.fTopID = @fTopID) 也是一个变量赋值语句,设定@fNodeCount变量保存的是要删除的主表记录(@fTopID变量的内容)所属的次类别表Navtion_NodeSubject中的记录的数量 根据主表记录查找其他表符合条件的这个语句可参考这个帖子: -------------------------------------------------------------------- If @fNodeCount > 0(作个标记,一级判断) 开始判断,如果@fNodeCount大于0,表示欲删除的主类别记录包含有子类别,不能直接删除,必须先删除子类别。 但删除子类别必须删除子类别下包含的所有内容(文章)记录,所以我们必须判断是否有内容记录 ----------------------------------------------------------------- Begin (作个标记,一级Begin) 表示If下面执行的多条语句,不懂的可以参考没人性的FAQ帖子 -------------------------------------------------------------- Set @fTextCount = (Select Count(*) From tText Where tText.fTopID = @fTopID) 上面代码继续赋值,@TextCount表示欲删除的主类别记录所包含的所有的内容(文章)记录的数量 ------------------------------------------ If @fTextCount > 0(标记,二级判断) 判断记录的数量,大于0表示有记录,这样必须先删除内容表的记录,再删除子类别表的记录,最后删除主类别表的记录,这样才不会出错。 Begin (标记 ,二级Beging 一) --------------------------------------------------- Delete From tText Where tText.fTopID = @fTopID Delete From Navtion_NodeSubject Where fTopID = @fTopID Delete From Navtion_TopSubject Where fTopID = @fTopID End(标记,二级Begin一的结束命令) 上面的语句很简单,首先删除tText表中fTopID符合@fTopID的记录(删除内容表) 然后删除Navtion_NodeSubject表符合@fTopID的记录(删除次类别表) 最后删除Navtion_TopSubject表符合@fTopID的记录(删除主类别表) ---------------------------------------------------- Else (标记,二级判断否则,表示@fTextCount=0,指内容表没有记录) -------------------------------------------------------- Begin (标记,二级Begin二) Delete From Navtion_NodeSubject Where fTopID = @fTopID Delete From Navtion_TopSubject Where fTopID = @fTopID End (标记,二级Begin二结束) 以上代码简单,tText表(内容表)没有记录,那么首先删除次类别表Navtion_NodeSubject中的记录,再删除主类别表Navtion_TopSubject中的记录。 ------------------------------------ End (标记,二级Begin结束) ------------------------------------- Else (标记:一级判断否则,表示次类别表没有内容@fNodeCount=0) ------------------------------------------------------------- Begin Delete From Navtion_TopSubject Where fTopID = @fTopID End 上面代码直接删除主类别表Navtion_TopSubject的记录 ----------------------------------------------------- 本来这个触发器已经结束,但是我们必须防止执行出错。所以如果出错,那么要回滚所有操作,并且向应用程序发送错误信息。 上面的代码是个语句块,表示如果上面的删除语句出错后怎么办 Rollback Transaction my_Save1 Rollback Transaction 是Sql Server的内部命令,表示回滚事务,就是以前的操作全部取消。my_Save1是上面保存的保存点的名称。 这个代码意思和玩游戏中没有过关,从存盘文件中恢复的道理一样。 :D ---------------------------------------------------------------------- Raiserror('删除出现错误,记录:%s及其所属内容没有被删除。',,1,@fTopName) Raiserror表示自定义错误信息,这个语句的作用是向使用Sql Server的应用程序发送信息。 如asp的代码,asp代码获得这个信息将显示在网页上。 ,1是错误的等级号码,这个我不做过多解释,有兴趣的人可以查看SQL Server联机丛书的 T-SQL语言参考。 %s是Reiserror命令的自定义变量 %s表示字符串变量,内容是后面的@fTopName的内容。 这个语句类似于以下VBScript代码(假设VBscript中有Raiserror命令) Raiserror('删除出现错误,记录:' & @fTopName & '及其所属内容没有被删除。',,1) ------------------------------------------------------------- 好了,这个触发器所有代码我都详细解释了,希望大家看得懂,并且通过上面的解释提高数据库操作的能力!

推荐整理分享sqlserver 触发器教程(sqlserver 触发器 redis),希望有所帮助,仅作参考,欢迎阅读内容。

sqlserver 触发器教程(sqlserver 触发器 redis)

文章相关热门搜索词:sqlserver 触发器 性能,sqlserver 触发器 redis,sqlserver 触发器 性能,sqlserver 触发器 删除时间 日志文件,sqlserver触发器语法,sqlserver 触发器新增数据修改,sqlserver 触发器 删除时间 日志文件,sqlserver 触发器 if 后边没执行,内容如对您有帮助,希望把文章链接给更多的朋友!

SqlServer中批量替换被插入的木马记录 最近找了找批量替换被插入的木马记录,找到了一条好的语句,用处很大,仅仅使用十几行游标语句,把整个数据库的所有表的恶意木马清除掉了,而

Sqlserver中char,nchar,varchar与Nvarchar的区别分析 1.char类型:对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存储定长数据很方便,CHAR字段上的索引效率极高,比如定义char(),那么不论你

win上安装SQL时CD-KEY(序列号)无法验证解决方法 方法一:在给出的输入CD-KEY(序列号)的界面中,输入你已经安装的windowsserver的CD-KEY(序列号)即可以继续安装,而不是SQL的CD-KEY(序列号)。Windowsserver2

标签: sqlserver 触发器 redis

本文链接地址:https://www.jiuchutong.com/biancheng/349148.html 转载请保留说明!

上一篇:将MSSQL Server 导入/导出到远程服务器教程的图文方法分享(sqlserver导出mysql)

下一篇:SqlServer中批量替换被插入的木马记录(sql批量替换字符串)

  • 结转和分配制造费用会计分录
  • 所有小规模都能抵税吗
  • 0税率发票有什么用
  • 红字发票信息表填好后再怎么操作
  • 预缴纳个人所得税
  • 营业成本利润率降低说明什么
  • 房地产企业销售额排名
  • 进项发票认证后暂不抵扣
  • 跨月作废发票怎么开
  • 质保金的税务处理
  • 住宿费增值税怎么算
  • 统一员工行为规范
  • 2017年消费税税率
  • 推广费是广告费和业务宣传费吗
  • 非居民企业啥意思
  • 长期股权投资的初始计量
  • 员工承担补缴社保的责任
  • 固定资产报废清理账务处理
  • 房屋租赁费应如何缴纳
  • 上市公司的股份可以转卖吗
  • 开房租发票交的税,因优惠政策退税,怎么账务处理
  • windows10安装应用怎么到桌面
  • 本月发生的费用,下月取得发票,怎么做账
  • 建筑工程给排水的内容
  • 外汇延期收款办理操作指南
  • 公司搞活动买的车能买吗
  • 普通发票主营业务怎么填
  • 贴现会不会损害所有者权益
  • Yii使用migrate命令执行sql语句的方法
  • 红字发票进项转出当期
  • 在建工程完成后转入什么科目
  • 会计科目分类有几种方法
  • series转换为dataframe
  • 增值税改动
  • 下列关于纳税人发生兼营行为
  • 租赁公司成本如何计算
  • python中if语句的用法
  • linux mint 下mysql中文支持问题
  • phpcms建站流程
  • 专项基金是什么
  • 外购商品发放给员工 进项税额能不能抵扣
  • 企业与企业之间通过互联网进行产品
  • 小规模附加税减免政策2023最新
  • 公允价值变动损益在利润表哪里
  • 个体户查账征收个人所得税税率
  • 公司买的吃的计入什么科目
  • 小规模纳税人公转私技巧
  • 固定资产资本化后续支出
  • 小规模企业应交税费分录
  • 新会计准则关于贷款损失准备
  • 给职工发放的米面油记入什么
  • 数字证书限额多少
  • 所有者权益增加额怎么计算
  • sql语句去除重复值
  • window10重装显卡驱动
  • win7电脑找不到无线网络连接图标
  • mac怎么批量删除qq好友
  • linux使用yum
  • linux中的查找命令
  • saproxy.exe - saproxy是什么进程 有什么用
  • win8如何更改用户名字?
  • win10系统右键菜单管理
  • win7共享文件设置
  • django框架结构
  • unity 加载文件 卡顿
  • nodejs执行cmd命令
  • cocos2dx游戏开发
  • win7支持快速启动吗
  • 实用的批处理
  • fastcgi iis
  • 基于zepto的移动端轻量级日期插件--date_picker
  • python文件的读操作方法
  • jquery插件开发方法
  • 怎么打印纳税申报清单
  • 怎么撤销税务三方协议
  • 企业购房契税怎么入账
  • 房产税自用改为出租,房产税如何申报
  • 怎么申请冬季取暖补贴
  • 水利建设基金的计提与会计处理
  • 山西一女子实名举报局长
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号