TSQL--可以在触发器中使用COMMIT吗?
很多场景中,我们使用触发器来回滚一些不满足业务逻辑的修改,这没有问题,问题是我能在触发器中提交事务吗?
这个问题很小白,当也来测试一下
/*
测试中创建三种表,对表 TB2 插入时触发触发器,
在触发器中将TB2中新插入的数据插入到 TB3 和 TB4
*/
USE TestDB
GO
DROP TABLE TB2
GO
DROP TABLE TB3
GO
DROP TABLE TB4
GO
CREATE TABLE TB2
(
ID INT PRIMARY KEY IDENTITY,
C1 INT
)
GO
CREATE TABLE TB3
(
ID INT PRIMARY KEY,
C1 INT
)
GO
CREATE TABLE TB4
(
ID INT PRIMARY KEY,
C1 INT
)
GO
--=======================================
--创建触发器
CREATE TRIGGER utr_TB2_INSERT
ON dbo.TB2
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.TB3(ID,C1)
SELECT ID,C1 FROM inserted
COMMIT
INSERT INTO dbo.TB4(ID,C1)
SELECT ID,C1 FROM inserted
END
GO
--====================================
--在事务中尝试插入数据
BEGIN TRAN TR1
INSERT INTO TB2(ID,C1)
SELECT 1,1
SELECT @@TRANCOUNT
COMMIT
--====================================
--错误提示
/*
Msg 544, Level 16, State 1, Line 4
Cannot insert explicit value for identity column in table 'TB2' when IDENTITY_INSERT is set to OFF.
*/
--====================================
--====================================
--在非事务中尝试插入数据
INSERT INTO TB2(ID,C1)
SELECT 1
--====================================
--错误提示
/*
Msg 120, Level 15, State 1, Line 3
The select list for the INSERT statement contains fewer items than the insert list.
The number of SELECT values must match the number of INSERT columns.
*/
--====================================
测试结论:
虽然可以创建出包含COMMIT语句的触发器,但是不应该在触发器中提交事务。
扩充:
如果不希望触发器中操作异常引发外部回滚,是否可以使用事务点来实现
--=======================================
--创建触发器
DROP TRIGGER [dbo].[utr_TB2_INSERT]
GO
CREATE TRIGGER utr_TB2_INSERT
ON dbo.TB2
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
SAVE TRANSACTION TR1;
BEGIN TRY
INSERT INTO dbo.TB3(ID,C1)
SELECT ID,C1 FROM inserted
INSERT INTO dbo.TB4(ID,C1)
SELECT ID,C1 FROM inserted
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION TR1
END CATCH
END
GO
--=======================================
--答案:不可以
/*
Msg 3931, Level 16, State 1, Procedure utr_TB2_INSERT, Line 17
The current transaction cannot be committed and cannot be rolled back to a savepoint.
Roll back the entire transaction.
*/
TSQL--可以在触发器中使用COMMIT吗?的更多相关文章
- oracle 中触发器增加存储过程commit问题
触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了 当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务 ...
- ORA-04092: COMMIT 不能在触发器中
触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了 当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务 ...
- 如何在Oracle触发器中使用查询语句
通常情况下,Oracle数据库禁止在行级触发器或行级触发器所调用的子程序中使用查询语句.但是,面对复杂的业务逻辑,不可避免的要使用查询语句. 当在行级触发器中使用查询语句时,Oracle数据库会抛出O ...
- Oracle中的commit详解
本文转自 : http://blog.csdn.net/hzhsan/article/details/9719307 它执行的时候,你不会有什么感觉.commit在数据库编程的时候很常用,当你执行DM ...
- SQL触发器中的deleted表和inserted表
SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...
- 使用t-sql从身份证号中提取生日
使用t-sql从身份证号中提取生日,一下是转换16位身份证号的例子,仅供参考. create function getDateFromID( ) ) returns datetime as begin ...
- oracle触发器中增删改查本表
oracle触发器中增删改查本表 (1)只有before insert触发器中才可以查询或更新本表 create or replace trigger tri_test_ins before inse ...
- 触发器中的inserted表和deleted表
触发器语句中使用了两种特殊的表:deleted 表和 inserted 表.Microsoft? SQL Server 2000 自动创建和管理这些表.可以使用这两个临时的驻留内存的表测试某些数据修改 ...
- SQL server触发器中 update insert delete 分别给写个例子被。
SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...
随机推荐
- Netty生产级的心跳和重连机制
今天研究的是,心跳和重连,虽然这次是大神写的代码,但是万变不离其宗,我们先回顾一下Netty应用心跳和重连的整个过程: 1)客户端连接服务端 2)在客户端的的ChannelPipeline中加入一个比 ...
- jquery 三元运算
三元运算: 条件 ? 条件为真取此值 : 条件为假取此值; var v = $(:check).prop('checked')?faule:true; $(:check).prop('checked ...
- 如何去掉Myeclipse对JS等文件的验证
或 MyEclipse->validation->Excluded Resource下找到不需要验证的文件或者文件夹 或 右键点击该项目-->MyEclipse-->Exclu ...
- ios开发中一些常用API总结
转载于:http://www.cnblogs.com/zhucunliang/archive/2013/11/09/3416039.html //1.init初始化 NSString * str1 = ...
- C# Attribute的用法
{ { Attribute[] atts = Attribute.GetCustomAttribut ...
- Writing Surface Shaders
[Writing Surface Shaders] Writing shaders that interact with lighting is complex. There are differen ...
- [Unity Shader笔记]渲染路径--Forward渲染路径
[Unity Shader笔记]渲染路径--Forward渲染路径 (2014-04-22 20:08:25) 转载▼ 标签: shader unity renderingpath forward 游 ...
- linux系统中的进程
一.fork 在类unix系统中,我们所执行的任何程序,都是由父进程(parent process)所产生出来的一个子进程(child process),子进程在结束后,将返回到父进程去.此一现象被称 ...
- LINK : fatal error LNK1104: cannot open file "mfc42d.lib"
VC++6.0上建立了个基于MFC应用程序,在编译时候没出现错误,但在LINK的是时候出现这样的错误:Linking...LINK : fatal error LNK1104: cannot open ...
- C程序之包含头文件
在C程序中包含文件有以下两种方法: 方法一:#include<XXX.h> 这里的XXX一般是改动较小的标准库,用符号"<"和">"将要 ...