Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在触发器逻辑开始时提交事务_Sql Server_Tsql_Triggers - Fatal编程技术网

Sql server 在触发器逻辑开始时提交事务

Sql server 在触发器逻辑开始时提交事务,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我在一个表上有一个触发器(,INSERT之后,UPDATE),它的存在是为了根据表中添加或更新的内容计算值,并将它们存储在一个单独的表中 我已经读了很多关于触发器内部错误处理的内容,事实上,触发器逻辑中的错误将回滚最初调用触发器的原始事务 为了不惜一切代价保留原始事务(假设在某一点上触发器可能会失败),我从这样做开始编写代码 -- Grab newly inserted data SELECT * INTO #Temp FROM IN

我在一个表上有一个触发器(
,INSERT之后,UPDATE
),它的存在是为了根据表中添加或更新的内容计算值,并将它们存储在一个单独的表中

我已经读了很多关于触发器内部错误处理的内容,事实上,触发器逻辑中的错误将
回滚最初调用触发器的原始事务

为了不惜一切代价保留原始事务(假设在某一点上触发器可能会失败),我从这样做开始编写代码

-- Grab newly inserted data
SELECT          *
INTO            #Temp
FROM            INSERTED

-- Force transaction to finish, making sure following statements don't roll it back
COMMIT          TRAN

-- Continue using data stored in #Temp
UPDATE          .....
SET             .....
FROM            #Temp

即使我在触发器逻辑中加入了故意错误,这个问题仍然有效,安全吗?

我不知道它是否安全。但作为一种替代方法,根据具体操作,您可以执行插入或更新,然后使用输出接收插入的数据,并使用这些数据执行触发逻辑。这样,您就不需要触发器,但这取决于您的环境(它可能比触发器方法慢一点):

关于输出:
我不知道它是否安全。但作为一种替代方法,根据具体操作,您可以执行插入或更新,然后使用输出接收插入的数据,并使用这些数据执行触发逻辑。这样,您就不需要触发器,但这取决于您的环境(它可能比触发器方法慢一点):

关于输出:

-- update row status (in progress)

update Staging.GFTIntradayLivePricesStaging
set Status = 1 -- in progress
output INSERTED.GFTIntradayLivePricesStagingID into @RowsTransfered
where GFTIntradayLivePricesStaging.Status = 0 -- not processed
and exists
            (
                select top 1 1
                from Portfolio.Objects.Objects
                where GFTInstrumentID = GFTIntradayLivePricesStaging.GFTInstrumentID
            )