关于SQLServer2005的学习笔记——多触发器执行问题

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
问题描述:
在某环境中数据表存在多个触发器,数据的增删改是标准的每个表都有的触发器,此外还存在关于校验的触发器;起因是写完触发器后,有一次同事询问说触发器不起作用了,没有提示错误,但是数据无法保存;我也有点莫名其妙,在查询分析器中执行直接就提示错误了,可在应用程序中无法提示错误。
同事提醒说需要执行一段设置触发器触发先后顺序的代码,查了一下为 sp_settriggerorder ;看了下帮助修改了一下即可。不过只看 SQLServer 联机帮助似乎是无法理解的,通过此次才了解该存储过程的意义。
顺便提一句,本环境是在SQLServer2000中,非2005中

以下为联机帮助中的释义。
sp_settriggerorder
指定第一个或最后一个激发的、与表关联的AFTER 触发器。在第一个和最后一个触发器之间激发的AFTER 触发器将按未定义的顺序执行。
语法
sp_settriggerorder [@triggername = ]' triggername 'ITPUB个人空间9b6L.E#z2O 
    , [@order = ]' value 'ITPUB个人空间.\8z_ UL#O 
    , [@stmttype = ]' statement_type ' 
 
 
做个简单测试 ,新建 2 张表和 2 个触发器
CREATE TABLE TestA
(
  a VARCHAR(20)
);
CREATE TABLE TestB
(
  a VARCHAR(20)
);
ALTER  TRIGGER [Tri_Test1] ON TestA
AFTER INSERT,UPDATE
AS
SET NOCOUNT ON
DECLARE @a VARCHAR(20)
SELECT @a=a FROM INSERTED
IF @a='A' OR @a='a'
BEGIN
         RAISERROR ( ' 该条记有问题 , 不能重复保存! ', 16, 1 )
         ROLLBACK TRAN
         RETURN
END
 
ALTER  TRIGGER [Tri_Syn_Test1] ON TestA
AFTER INSERT,UPDATE
AS
SET NOCOUNT ON
INSERT INTO TestB SELECT a FROM inserted
COMMIT;
  
 
 
为 TestA 表插入一个 A 值,系统提示该条记有问题 , 不能重复保存!
但是假如在应用程序中的话,很可能系统不会提示错误,但是保存失败,原因是 Tri_Syn_Test1 一定会执行成功,而应用程序捕获不到后面触发器中的错误了。
这个时候需要将 Order 设置为 first
INSERT INTO TestA VALUES('A')
sp_settriggerorder @triggername= '30SJK_TEST_U.Tri_Test1', @order='first', @stmttype = 'UPDATE';
sp_settriggerorder @triggername= '30SJK_TEST_U.Tri_Test1', @order='first', @stmttype = 'INSERT'; 
 




本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/310455,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
SQL Oracle 关系型数据库
数据库sqlserver-----触发器的插入,更新和删除
数据库sqlserver-----触发器的插入,更新和删除
43 3
|
1月前
|
存储 SQL
SQL Server 存储过程 触发器 事务处理
SQL Server 存储过程 触发器 事务处理
|
11月前
|
存储 SQL 安全
数据库SQL Server 9-10 章(存储过程与触发器)
数据库SQL Server 9-10 章(存储过程与触发器)
159 0
|
11月前
|
SQL 存储 监控
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
1443 1
|
11月前
|
存储 SQL 数据库
sqlserver触发器的使用以及inserted和deleted详解
sqlserver触发器的使用以及inserted和deleted详解
484 0
|
11月前
|
SQL 存储 安全
SQL Server——触发器
触发器,是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。经常通过触发器来强制实现不同表中的逻辑相关数据的引用完整性或一致性。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过过程名字而直接调用。当对某一个表进行诸如UPDATE、INSERT、DELETE这些操作时,SQL Server就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则
|
11月前
|
SQL 存储 开发框架
SqlServer触发器的创建与使用
SqlServer触发器的创建与使用
|
数据库
【学习笔记】Sqlserver/Mssql注入总结(三)
这是Sqlserver/Mssql注入总结的第三篇,将围绕布尔盲注入和一些特殊字符过滤的绕过进行讲述,有需要的可以考虑收藏保存,当做备忘录使用。
169 0
|
数据库
【学习笔记】Sqlserver/Mssql注入总结(二)
这是Sqlserver/Mssql注入总结的第二篇,将围绕报错注入进行讲述,有需要的可以考虑收藏保存,当做备忘录使用。
181 0
|
数据库
【学习笔记】Sqlserver/Mssql注入总结(一)
这是Sqlserver/Mssql注入总结的第一篇,将围绕union联合注入进行讲述,内容相对来说,比较中规中矩,有需要的可以考虑收藏保存,当做备忘录使用。
291 0