位置: 编程技术 - 正文

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

  • 个人住房5年后买卖如何交税?
  • 23年车辆购置税税率
  • 查验发票会显示名字吗
  • 费用分割单模板
  • 一般纳税人需要申报什么税
  • 企业所得税纳税调整明细表
  • 为职工支付的补充养老保险计入哪
  • 企业所得税弥补亏损年限
  • 收到三代手续费返还
  • 不动产分割的法律规定
  • 出口退税备案完后怎么办
  • 别人送我免费赠品
  • 购入汽车
  • 材料发票不够怎么办
  • 税收分类编码如何填写
  • 增值税申报内容及步骤
  • 残保金属于职工薪酬吗
  • 如何根据原始凭证填制记账凭证
  • 财务报表年报和季报必须一样吗
  • 支付工程款时有哪些费用
  • 专项资金如何做账务处理
  • 土地增值税地价扣除
  • 借应收账款贷应收账款是什么意思
  • 公司注销了是不是就不能用了
  • 收到挂靠方应缴纳税款如何做账?
  • 老板和公司账务处理流程
  • 厂区绿化工程计入什么科目
  • 网速变慢的原因有哪些
  • 应付债券借贷
  • php vr
  • 以旧换新销项税额对企业采取以旧换新方式销售
  • CI(Codeigniter)的Setting增强配置类实例
  • 可供分配利润在财报哪里
  • 二级路由器怎么配置
  • 企业低值易耗品摊销计入产品成本的方法
  • java分页page类
  • 技术人员工资属于什么费用
  • 科罗拉多河上的月光简谱
  • vue 图片转base64格式的方法
  • 微信登录接口购买
  • 数据结构的单链表
  • 入库管理业务流程图
  • 年度报表资产总额平均值怎么算
  • 2021新旧会计准则的比较分析
  • 工程类企业存货
  • 浅谈一下新冠的好处
  • 一般纳税人认定书是什么样子
  • 异地预交所得税分录
  • 固定资产资本化后续支出
  • 异地工程可以在公司所在地缴纳税款吗
  • 财务负责人怎么实名认证
  • 研发支出资本化支出在资产负债表哪里体现
  • 会计记账借贷记什么账户
  • IIS7在Windows Server 2008R2的新改进
  • window打开注册表
  • macbook如何安装windows
  • centos7修复安装
  • linux fdisk -l
  • gcf是什么软件的文件
  • linux怎么删除文本文件
  • win7系统怎么查看内存
  • Android游戏开发教程
  • cocos2d schedule
  • UNIX sh(Bourne Shell)脚本里面使用数组的两种方法
  • 如何让卖家给你乖乖退款
  • perl do
  • 非递归快速排序python
  • particular粒子怎么用
  • android重写方法
  • django批量创建数据
  • 从重置手
  • 广东省电子税务局app下载手机版
  • 浙江网上税务局登录官网
  • 北京税务局网上开发票
  • 出租车开的发票如何查询校验码?
  • 税盘注销了怎么申报增值税
  • 西安大修基金和契税怎么计算
  • 外贸公司销售额可以10亿以上吗
  • 税务宣传标语2021
  • 经营工作会议
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设