SQL为会话设置最大受影响的行

时间:2015-08-06 17:10:04

标签: sql sql-server

我在DEV环境中与一群人一起工作,有时候我们对F5有点担心。我会每月说一个人更新表中的每个记录,而不是只更新1或2,因为他们错过了be子句或正在做类似的事情

Begin Transaction

update table1 
set column1 = '50'

select * from table1
where column2= 'abc'
and column3 = '123'

 If @@ROWCOUNT != 1
    Begin
        Rollback
        Print 'Failed ' + @Ticket
    End
 else
    Begin
        commit
        Print 'Success ' + @Ticket
    End

在这种情况下,他们意味着评论或删除选择行。我的问题是,如果X行数超过X行,你能设置一些自动回滚吗?我永远不会看到他们更新超过400左右。我告诉他们你开始交易和@@ RowCount验证,但因为它是2个陈述而第2个有正确的号码它没有帮助。

2 个答案:

答案 0 :(得分:1)

我怀疑SQL Server开箱即用为您提供了解决方案。如果这是一个大问题,那么使用定期计划的日志备份部署SQL Server数据库备份,这样您就可以恢复到给定的时间点。或者,限制他们的访问,以便他们只更新/插入/删除/查询procs(这可能不会缩放,但它是一个选项)。或者告诉他们在所有查询中使用TOP。

与此同时,确保您的开发人员永远不会对产品系统进行故障排除。

答案 1 :(得分:1)

听起来执行这些update查询的开发人员需要更严格。每次更新 - 即使在开发中 - 都应该用begin tranrollback编写,直到他们确定查询更新了正确的行。

例如,我总是使用以下模板:

-- review the data to be updated
select * from MyTable where MyColumn = 'A'

begin tran

update MyTable
set MyColumn = 'B'
where MyColumn = 'A'

-- be sure the query updated the expected number of rows
select @@rowcount 

-- re-review the original data to make sure those rows were changed
select * from MyTable where MyColumn = 'A'

-- reverse the changes; change this to a commit *only* when the above is proven to be correct
rollback

- 编辑 -

根据您的示例进行调整,您可以捕获变量中的@@ ROWCOUNT并稍后引用它。例如:

declare @RowsUpdated int = 0

Begin Transaction

update table1 
set column1 = '50'

-- capture the @@ROWCOUNT for use later
select @RowsUpdated = @@ROWCOUNT

-- you could add row counts from multiple update statements together:
-- select @RowsUpdated = @RowsUpdated + @@ROWCOUNT

select * from table1
where column2= 'abc'
and column3 = '123'

If @RowsUpdated != 1
Begin
    Rollback
    Print 'Failed ' + @Ticket
End
else
Begin
    commit
    Print 'Success ' + @Ticket
End