位置: 编程技术 - 正文

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批量替换字符串)

  • 缴纳印花税的会计凭证
  • 年初结转增值税社保如何做账
  • 地方税概述?
  • 未认证发票有时间限制吗
  • 职工报销的医药费计入什么科目
  • 公司提供住宿员工在外居住出现问题
  • 社保按基数交工资按时发怎么做账
  • 购买工业用地税费
  • 甲公司自2018年3月1日开始自行研发一款新兴产品
  • 2019年印花税税率多少
  • 分支机构是否享受小微企业企业所得税优惠?
  • 样品不收钱怎么做会计分录
  • 货币基金可以投资
  • 外贸企业出出口退税会计科目怎么做账?
  • 2018增值税暂行条例
  • 预缴税款的税率
  • 小规模纳税人国企
  • 增值税更正申报表需要逐月更正吗
  • 中小企业社保优惠延长政策
  • 折价处置抵押房地产的应当参照什么
  • 主营业务收入少记跨年怎么办
  • 社会保险费缴费凭据在哪查
  • 虚拟股权分红怎么做账
  • win 11bug
  • 有限公司注册资金多少好
  • 转包工程款怎么结算
  • 销售农产品的进项税
  • 固定资产改造时的账面价值
  • 公积金补缴需要去柜台吗
  • 汇付的注意事项有哪些内容
  • 摩洛哥首都拉巴特简介
  • css禁用button按钮
  • 企业与员工之间的法律
  • 进项税大于销项税,不用缴纳增值税
  • php实现购物车功能
  • yii框架的优点及原理
  • 无形资产有进项税吗
  • node与nodejs
  • Vue3通透教程【十三】TS简单类型详解
  • vue destroyed销毁组件
  • 购买方纳税人信息与第三方信息不符
  • java是什么意思
  • 固定资产改造费用化账务处理
  • 个税app重置申报
  • mongodb介绍
  • mongodb导入
  • 保证人不承担责任的情形(上)
  • 微信钱是不是现金
  • 销售收入未及时入账
  • 施工企业会计核算实验报告
  • 出口单证不全如何申报退税
  • 购进材料,已付,材料尚未验收入库
  • 作废的现金支票可以直接碎掉吗
  • 印花税税率是多少
  • 打印银行电子流水发到别人邮箱,能看到我的账户余额吗
  • 应付账款借方余额在资产负债表中怎么列示
  • 工会经费的使用应当依法接受国家的监督
  • 开票需要缴纳印花税吗
  • 红字更正法的使用范围是什么
  • sql server触发器实验
  • mysql数据库随机取数据
  • mysql5.7配置文件my.ini
  • macbook怎么剪视频软件
  • win7 64位旗舰版电脑鼠标如何才能设置成左手操作?设置鼠标为左手操作的方法
  • javascript.info
  • unity中mathf
  • nodejs 异步
  • Lesson01_05 HTML中的超链接
  • 设计一个windows
  • javascript运用
  • unity更新下载文件
  • android 开源
  • js 设计模式
  • python一些简单操作
  • jqueryui
  • 车辆购置税查询平台
  • 在水贝买的黄金
  • 广东电子税务局财务报表在哪里查询
  • 员工持股计划与股权激励哪个好
  • 融资租赁出租会计账务处理流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设