位置: 编程技术 - 正文

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

  • 普通发票为什么只能领一张
  • 法人向公司账户汇款怎么做账
  • 电子发票和纸质发票只能二选一吗
  • 技术服务费怎么算成本
  • 购入生产线属于固定资产吗
  • 有两处收入的怎么报个税汇算清缴
  • 贷款受托支付可以给股东吗
  • 增值税一般纳税人资格登记表
  • 预缴的增值税怎么算
  • 子公司注销资金还母公司冲实收资本吗
  • 地下车位未使用 要交物业服务费
  • 哪些税金不得在借方增加
  • 经济合同
  • 营改增之前材料含税吗
  • 未计提职工教育经费汇算清缴
  • 工程结算与工程施工
  • 不能抵扣的进项税怎么做账
  • 6位开票代码是几位数
  • 实收资本印花税最新规定
  • 公司汽车保养费用怎么做账
  • 公司低价处理旧汽车涉税账务处理
  • 个人将房产无偿赠与他人应交个人所得税吗
  • 个人代收工程款分录
  • mac app store一直转圈圈
  • 对外投资包括哪些投资项目
  • 会计科目发出商品
  • 公司给员工的餐补有没有个税
  • 电脑非法关机后开机进不了系统
  • 台式机装win10哪个版本好
  • 居民企业应纳税额
  • redhat无法进入图形界面
  • 在linux中使用什么命令可以动态查看文件内容
  • 微博怎么变成大v
  • 利用均匀水流导致的水位变化来显示时间
  • 全球矿业巨头力拓集团
  • php用法
  • 材料成本差异属于流动资产吗
  • php代码生成
  • phpstudy目录
  • 制造费用的工资怎么结转
  • php弹出登录框
  • 劳务费支出计入什么会计科目
  • 增值税普通发票查询真伪
  • 秸秆回收加工项目
  • python如何在一个文件中运行另一个文件
  • 设计模式golang
  • 应税销售行为有哪些
  • SQL Server 2008 R2 为用户权限分配的操作步骤
  • sql无法运行
  • 中标的工程交易怎么处理
  • 差额征税的专用发票能抵扣吗
  • 股东不任职,是否可以参与企业经营
  • 先预付货款,货到了怎么做账
  • 核定征收企业有没有自然人电子税务
  • 电费已支付未充值
  • 契税应该计入税金及附加吗
  • 资本性支出是什么活动
  • 营改增之前广告位出租
  • 已认证专票发现地址为错误
  • 资产负债表负债率怎么计算
  • 收到的专票必须当月认证吗
  • 企业投资所得如何征税
  • 旅游饮食服务业与营业无关的收入计入营业外收入账户
  • mysql在查询结果中查询
  • windows允许多用户登录
  • 快速复制一张同样的幻灯片
  • ubuntudde 中文
  • win7系统不能用了?
  • win7防火墙在哪设置
  • nodejs调用go
  • android环境搭建教程
  • 在批改中,可以使用x表示错误
  • r+python
  • enum枚举类型
  • Unity3D游戏开发pdf
  • 房屋设备租赁费
  • 广东省国家税务总局稽查局局长
  • 税控盘抄报反写工作难度
  • 划拨土地是否可以出租的法律规定
  • 宏观经济十大因素有哪些
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设