在同一个交易中插入和删除?

时间:2016-08-22 19:40:44

标签: sql sql-server ssis

我有一些带有一些数据的Temp_Table。根据Temp_Table中的数据,我将删除其他表中的相关行,然后将Temp-table中的所有数据插入table1。像下面的例子。

我可以用什么方式锁定Server2.Table1(我独占)并在放开锁定之前同时运行Delete和Insert语句?我不想要任何人在我执行删除/插入时读取或写入Table1。请注意,删除必须在 插入语句之前运行。

SSIS有办法做到这一点吗?或者我可以在开头使用Begin事务并在语句之后提交事务吗?我担心删除和插入都会在同一个事务中同时运行..

DELETE Table1 
FROM Table1 t1
    INNER JOIN (    
       SELECT Column2 FROM Temp_Table
       GROUP BY Column2
    ) t2 ON t1.Column2 = t2.Column2

INSERT INTO Table1
SELECT (Column1, Column2...)
FROM Temp_Table

4 个答案:

答案 0 :(得分:0)

您可以使用delete中的OUTPUT子句插入临时表

DELETE FROM dbo.table1  
OUTPUT DELETED.* INTO @MyTable  --or temp table   
WHERE id = 10

在这种情况下,两个操作都将在单个事务中进行..

答案 1 :(得分:0)

SteveRs的评论是正确的,交易中的插入和删除语句并未同时运行。在对非生产数据库进行一些测试后,我得到了以下结果:

BEGIN TRY
    BEGIN TRAN T1;

DELETE Table1 
FROM Table1 t1
    INNER JOIN (    
       SELECT Column2 FROM Temp_Table
       GROUP BY Column2
    ) t2 ON t1.Column2 = t2.Column2

INSERT INTO Table1 (Column 1, Column2...)
SELECT (Column1, Column2...)
FROM Temp_Table

COMMIT TRAN T1;

END TRY
BEGIN CATCH
        ROLLBACK TRAN T1;
END CATCH

首先执行Delete语句,然后执行Insert语句。并且不会在声明之间发布独占锁。

答案 2 :(得分:0)

合并状态表也将起作用。

通过合并,您可以在单个查询中合并所有操作,包括插入,更新和删除。 该操作基于两个表和条件之间的比较 选择先更新然后插入。

答案 3 :(得分:-4)

我不是最好的SQL,但你可以删除其他用户的INSERT / UPDATE / DELETE权限,直到你完成。

REVOKE INSERT, UPDATE, DELETE ON Table1 FROM [username]

可能有更好的方法。

你也可以在删除时将插入放在触发器上,但这并不能保证其他任何事务都不会进入。