今天在生产环境上解决问题,由于广发银行的管理制度是开发公司是不允许确生产环境的,所以我们只能把要更新的语句发给运营中心,由运营中心的投产人员执行,我们则在旁边看着;在他执行的时候发现了一个很有趣的技巧,现在分享出来。
我们知道每一次在生产环境中执行中执行更新删除语句的时候都要格外小心,要做好数据备份,但是即便这样对于一个做了分库分表设计,有十几个G的库来说更新一句SQL后发现忘记写WHERE语句或是语句写错了,恢复备份的成本都是相当高的。
我注意到运营中心的人在拿到我的SQL语句后,把它放到MSSMS中后在前面加上了BEGIN TRAN,最后加上了—COMMIT,然后就放心的执行了,玄机就在这里了。这么说有点抽象,我举个例子:
假设我要更新生产中的一个叫做UserName的人的名字,原来的名字叫许小鹏,要改成的名字叫许鹏,这样的话我就写了一条SQL语句如下
UPDATE dbo.SEC_Users SET [UserName]=‘许鹏‘
如果直接执行的话,可能悲剧就发生了,因为我忘记写WHERE语句了。但是如果更成如下:
BEGIN TRAN
UPDATE dbo.SEC_Users SET [UserName]=‘许鹏‘
--COMMIT
这样的话执行一下,发现影响了很多行,而不是期望中的影响了一行,所以这个时候我们还是有机会回滚的,如果我们写的没有问题的话,如下
BEGIN TRAN
UPDATE dbo.SEC_Users SET [UserName]=‘许鹏‘ WHERE [UserName]=‘许小鹏‘
--COMMIT
这样的话执行一下,发现影响了很1行,这是在我们期望中的,所以我们继续执行下面的COMMIT保证了这个事务提交成功。