位置: 编程技术 - 正文

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

编辑:rootadmin
主类别表名: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批量替换字符串)

  • 抗税的性质
  • 事业单位净资产为负数怎么办
  • 车辆购置税可以刷信用卡吗?
  • 增值税发票怎么抵扣
  • 发票已经做账但要退款账不平咋办
  • 借款利息收入要开票吗
  • 预授权撤销怎么撤销
  • 商贸企业印花税税率
  • 商铺售后回租会计处理
  • 哪些企业可以享受加计抵减政策
  • 固定资产累计折旧借贷方向
  • 债权投资的账务处理步骤
  • 合作社土地入股协议
  • 结转预交增值税会计处理
  • 买卖汇票是什么意思
  • 开业赠送礼品会计属于什么费用
  • 营改增后房地产开发企业需要交哪些税?
  • 营改增之后对企业的影响
  • 成本费用跨年度怎么计算
  • 今年调整上年收入的政策
  • 劳务费个人所得税税率表2023最新
  • 增值税普通发票怎么开
  • 劳务费发票已开款未收回如何做帐?
  • vue城市列表插件
  • 解除劳动关系取公积金
  • php中的类是什么
  • type3插件
  • php循环结构有哪几种语句
  • 季度交企业所得税是按照什么来交的
  • 累积带薪缺勤的原因分析
  • 最早遥控器是谁发明的
  • php rewind
  • 未开票收入本月未收款的分录
  • redis 缓存框架
  • 前端cli搭建
  • 增值税和所得税重复交了吗
  • 借款凭证会计分录是什么
  • 核销已计提坏账的应收账款
  • 企业合并财务报表项目有哪些
  • 其他应收账款为个人借款
  • 汇兑损益的会计处理原则
  • 银行承兑到期后几天内有效
  • 罚款属于其他业务收入吗
  • 织梦使用教程
  • 安装mysql时出现错误
  • 制造车间买来刀具怎么办
  • 网红产品的推广文案
  • 土地增值税清算全流程实战案例
  • 资产损失账务处理要求
  • 股东转让股权公司需要审查
  • 企业所得税视同销售的会计处理是?
  • 申报个人所得税的软件叫什么
  • 科研专用费是什么
  • 现金流量表每月要报吗
  • 收到招聘费发票怎么做账
  • 资产减值损失的账务处理
  • 子公司的亏损能算到母公司吗
  • 借款利息怎么记账
  • mysql数据查询语句
  • centos禁止用户登录
  • mac笔记软件推荐
  • win10预览版和正式版
  • mac真好用
  • win8小键盘怎么打开
  • Win10手机版校
  • 在linux系统中,用来存放系统所需要的配置文件和子目录
  • Unity3D-SLua+ProtocolBuffers构建说明
  • 第一次接触怎么形容
  • 字符串转enum
  • node.js怎么搭建服务器
  • 在JavaScript中声明变量的关键词有
  • nodejs中使用HTTP分块响应和定时器示例代码
  • js文字循环滚动代码
  • jquery插件库怎么导入
  • pycharm flask框架
  • 广东电子税务局手机版
  • 教育培训行业的发展前景
  • 同城通办办税大厅
  • 物业监控不完善怎么提意见
  • 草原补偿标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设