如何最大程度地减少意外修改错误数据库的风险?


12

我刚刚学到了一种很难的方法,即在对象资源管理器中与服务器断开连接不会阻止您随后执行已在该服务器上打开的查询窗口。

我的情况是这样的:我有一个SSMS实例,可用于连接到我们的开发/登台服务器和生产服务器。我不得不删除有关dev的大量数据,所以我认为应该关闭与生产的连接,但是我没有注意我正在使用的查询窗口。(幸运的是,我们只有几个小时的备份时间。)

我不是破坏生产数据的第一个人,我肯定不会是最后一个。因此,我正在寻找清单,最佳实践等,以帮助您最大程度地减少对错误数据库执行查询的风险。您以前是否遇到过这种情况,您如何调整工作流程来避免这种情况?


4
注意您在做什么。
swasheck 2014年

我的SQL工具(不是SSMS)允许我打开“只读模式”,该模式仅拒绝任何可能更改数据库的语句。
a_horse_with_no_name 2014年

获得充足的睡眠和运动,多加注意。

Answers:


11

我想在SSMS中做的一件事是在连接数据库时使用“自定义颜色”。因此,对于Live数据库,您选择一个不错的亮红色,对于开发或测试系统,则选择一个柔和的蓝色或绿色。我曾经使用内置的SSMS,但如今,我更喜欢使用SSMS Tools Addon Color编码。

像这样

或像这样针对SSMS Tools(一个非常不错的插件,而且我发现顶部的颜色比内置的颜色更好,而不是底部的颜色) 或这个


2
+1这就是我的工作。红色用于生产,黄色用于测试环境,绿色用于我的本地开发数据库。旧的交通灯隐喻在这里很好用。
LeopardSkinPillBoxHat

6

根据谁你问,这将需要多一点的工作,但我一直在使用下面的语句习惯了所有的生产或试生产的查询窗口,并为所有UPDATEDELETEINSERT在所有环境中的语句。

BEGIN TRAN
-- END OF QUERY WINDOWS
ROLLBACK TRAN
PRINT 'Transaction rolled back.'

如果看到此消息,我将立即知道“糟糕,该查询窗口仍处于连接状态”或“糟糕,我自动执行了我不应该执行的操作”-是的,您可以在对象资源管理器中关闭数据库,但是查询窗口仍然可以连接。在我看来,所有生产查询都应突出显示并与BEGIN TRAN;一起运行;偶然发生的F5,应将所有内容回滚,而不是COMMIT。这是在迫使用户意识到自己的行为;就像拍摄每顿饭的照片一样,可以帮助您减轻体重,因为您必须停下来想一想自己在做什么。

需要更长的时间吗?是。它会阻止100%的错误。是的,因为没有任何事情可提交,除非我手动强制COMMIT输入,然后再键入它,这的本质本质迫使我考虑了COMMIT


4
我也讲过这种做法(这是SSMS工具包的另一个功能-允许您自定义“新查询”模板),但是您必须注意相反的情况-您突出显示BEGIN TRAN和查询,但忘记运行提交或回滚,然后在离开大楼吃午餐,周末或休假六个月时吹口哨。
阿龙贝特朗

6

创建第二个用户帐户以进行生产更改,并撤消您的帐户当前具有的访问权限。当您想在生产中进行操作时,可以以第二个用户身份运行ssms。

编辑:这只会在域登录的情况下是有益的。如果您有两个单独的域帐户,则将不得不为DEV和PROD具有单独的SSMS实例。如果您不使用域帐户,则此建议并不能帮助您。

另外,如果您使用单独的域帐户,则可以调整每个用户的SSMS颜色设置,对于连接到PROD的帐户,可能会有亮红色背景。

这也是我想到的一个很好的白皮书:http : //download.microsoft.com/download/D/2/D/D2D931E9-B6B5-4E3B-B0AF-22C749F9BB7E/SQL_Server_Separation_of_Duties_White_Paper_Jul2011.docx

它讨论了诸如不为您的每日登录帐户授予完全SA访问权限之类的问题。


您是说会以某种方式禁止从单个SSMS实例访问多个服务器?还是我错过了什么?
2014年

我们已经在使用不同的用户帐户,我真的看不出有什么帮助。
Stijn 2014年

1
我想这仅在您使用域帐户时才真正适用。如果是这种情况,或者将迫使您为DEV和PROD连接使用单独的SSMS实例。也许我会写一个SSMS插件来帮助解决这种情况,也许每当您尝试在生产连接上运行代码时都会弹出警告...
Mark Wilkinson 2014年

抱歉,评论中的所有错字。清晨通过手机回复...但是您明白了。:)
马克·威尔金森

是的,我确实得到了您的答案的要点:)也许您可以将您的评论纳入您的答案?
Stijn 2014年


2

在我的一项工作中,我们为此目的开发了一种工具。

如果要在PROD上运行一条语句,它会强制您编写:

run_sql servername PROD <file_with_sqlstatements>.sql

它将结果写入日志文件,并将执行结果附加到管理数据库中的日志中。例如,当我们想弄清楚谁是最后更改某张桌子的人时,它非常方便。

在SSMS中,当您注册了服务器时,可以为连接应用某种颜色,例如,所有PROD连接的底部都具有红色。但是,如果可能的话,最好避免在生产服务器上使用GUI工具。


我仅在机器上运行SSMS,关于连接字符串颜色的很好提示。
Stijn 2014年

3
@Stijn请注意,内置的颜色功能并非在所有情况下都有效-取决于打开查询窗口的方式。SSMS Tools Pack更加可靠(但在SSMS 2012+上不是免费的)。Mladen刚刚发布了2014年兼容版本。
亚伦·伯特兰

@Aaron这个工具看起来非常有趣,我来看看试用版,谢谢!
Stijn 2014年

4
另一个替代的着色解决方案是在SQL Prompt中,尽管它不是免费的,但却是一个非常漂亮的工具包。这将使SSMS顶部的标签着色,而不仅仅是底部的颜色。
马克·辛金森

1

再提两个提示,因为我在这里没有看到类似的东西:

  1. 在我的工作流程中,我经常在一个窗口中处理多个语句,并且我习惯于选择文本然后运行流程。但是我总是害怕在没有选择任何文本的情况下不小心按F5键并因此在窗口中执行所有语句。因此,每次我打开一个新窗口时,我都会从键入任何垃圾SQL拒绝编译的内容开始。这有效地使整个批次不可执行。(警告!如果您使用多个以分隔的批次,GO则每个批次都需要垃圾。)

  2. 在生产服务器上进行数据更改时(或每当我需要特别注意时)-隐式事务非常有用(您要么SET IMPLICIT_TRANSACTIONS ON更改SSMS中的选项,要么使该选项对每个新窗口均有效)。这样,每个不在事务中的语句都会启动一个新事务。我只有在两次确保自己做了我打算做的事情后才能作出承诺。


0

尝试使用单独的Windows用户,该用户是唯一配置了生产数据库的用户。将此用户的整个颜色主题设置为红色。通过快速的用户切换,这应该没问题。

切勿在开发计算机上的帐户中使用生产凭证。一个简短的电话或同事问题,之后您很高兴为新的测试运行删除所有内容...

另一个选择(相同的想法)是使用具有不同主题的远程桌面或虚拟机。


0

防止在按下F5时在查询窗口中执行所有操作的另一种相当直接的方法是,用/ *和* /包围所有内容,从而使整个内容成为注释。

您仍然可以通过突出显示它们并按常规方式按F5来执行所需的语句,即使它们包含在注释中也是如此。

注意:如果选择此方法,将无法从语法突出显示或自动完成功能中受益,但是,如果您没有过多使用这些功能,则有必要牺牲它们以确保100%不可能损坏意外F5的数据库。

编辑:您也将无法在查询窗口中的任何地方使用/ * * /,否则您将无意间取消注释后续代码。需要坚持使用-表示法。


-1

同意swasheck对原始问题的评论,如何执行...

选择@@服务器名+'\'+ @@服务名

...在运行任何DML之前,或者甚至查看状态栏以查看您连接到的实例,或者甚至在事务中运行所有DML之前,以便在意识到自己犯了一个错误时可以回滚?这里有很多很棒的建议,但是基本上,当涉及到潜在的破坏性DML时,头只会带您到目前为止。我总是检查,仔细检查并再次检查。而且,如果我要处理少量数据,我什至可以在DML之前选择入一个新表,运行DML,进行一些比较以确保一切正常,然后删除“备份”表。更聪明地工作,而不是更努力。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.