我在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个有正确的号码它没有帮助。
答案 0 :(得分:1)
我怀疑SQL Server开箱即用为您提供了解决方案。如果这是一个大问题,那么使用定期计划的日志备份部署SQL Server数据库备份,这样您就可以恢复到给定的时间点。或者,限制他们的访问,以便他们只更新/插入/删除/查询procs(这可能不会缩放,但它是一个选项)。或者告诉他们在所有查询中使用TOP。
与此同时,确保您的开发人员永远不会对产品系统进行故障排除。
答案 1 :(得分:1)
听起来执行这些update
查询的开发人员需要更严格。每次更新 - 即使在开发中 - 都应该用begin tran
和rollback
编写,直到他们确定查询更新了正确的行。
例如,我总是使用以下模板:
-- 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