Sql server 在SQL Management Studio中删除/更新之前确认?

Sql server 在SQL Management Studio中删除/更新之前确认?,sql-server,ssms,Sql Server,Ssms,因此,连续第二天,有人删除了整个数据表,而不是他们试图删除的那一行,因为他们没有限定的where子句 我对mgmt studio选项进行了上下搜索,但找不到确认选项。我知道其他数据库的其他工具也有。在运行DELETE语句之前,请尝试使用begintransaction 然后,您可以选择提交或回滚相同。在“工具”>“选项”>“查询执行”>“SQL Server”>“ANSI”下,您可以启用隐式事务选项,这意味着您无需显式包含Begin Transaction命令 这样做的明显缺点是,您可能会忘记在

因此,连续第二天,有人删除了整个数据表,而不是他们试图删除的那一行,因为他们没有限定的where子句


我对mgmt studio选项进行了上下搜索,但找不到确认选项。我知道其他数据库的其他工具也有。

在运行
DELETE
语句之前,请尝试使用
begintransaction


然后,您可以选择
提交
回滚
相同。

在“工具”>“选项”>“查询执行”>“SQL Server”>“ANSI”下,您可以启用隐式事务选项,这意味着您无需显式包含Begin Transaction命令

这样做的明显缺点是,您可能会忘记在最后添加提交(或回滚),或者更糟糕的是,默认情况下,您的同事会在每个脚本的末尾添加提交

你可以把马牵到河边


您可能会建议他们在做任何事情之前(取决于您的数据库大小)都要进行临时备份,以防万一。

这就是为什么我认为您应该始终:

1在部署到生产环境之前,使用在开发人员数据库上测试的存储过程

2选择删除前的数据

3名使用面试和绩效评估流程的屏幕开发人员:)

4根据它们删除/不删除多少数据库表进行性能评估


5将生产数据视为有毒的数据,并非常害怕

穿上你最好的衣服,直到他们学会放在WHERE子句中


最好的建议是让数据库中乱七八糟的东西在测试时使用事务。这对防止“呜呜”的时刻有很大帮助。需要注意的是,现在您必须告诉他们提交或回滚,因为他们肯定会至少锁定您的数据库一次。

在SSMS 2005中,您可以在工具|选项|查询执行| SQL Server | ANSI。。。选中
设置隐式\u事务
。这将需要提交以影响未来连接的更新/删除查询

对于当前查询,请转到查询|查询选项|执行| ANSI并选中相同的框

也有SSMS 2000的说明,如果您正在使用的话


正如其他人指出的那样,这并不能解决根本原因:在您创建的每个新查询的末尾粘贴COMMIT几乎和首先触发查询一样简单。

我建议您应该始终首先使用WHERE子句编写SELECT语句并执行它,以实际查看DELETE命令将删除哪些行。然后使用相同的WHERE子句执行DELETE。更新也是如此。

因此,连续第二天,有人删除了整个数据表,而不是他们试图删除的那一行,因为他们没有限定的where子句

也许唯一的解决办法是用其他人代替某人;)。否则,他们总会找到解决办法


最终限制此人对数据库的访问,并向他们提供获取where子句中使用的参数的存储过程,并授予他们执行该存储过程的访问权限。

首先,这是审核表的用途。如果您知道谁删除了所有记录,您可以限制他们的数据库权限,也可以从性能角度处理他们。上一个在我办公室做这件事的人目前正在试用期。如果她再这样做,她就会被解雇。如果您有权访问生产数据,您有责任确保不会造成伤害,这是其中之一。这既是一个技术问题,也是一个性能问题。您永远无法找到防止人们犯愚蠢错误的方法(数据库无法知道您的意思是删除表a还是删除表a,其中id=100,大多数人会自动点击确认)。您只能通过确保运行此代码的人员负责,并通过实施策略来帮助他们记住该做什么,来尝试减少这些问题。如果员工对您的业务数据有不负责任的行为模式(特别是在他们收到警告后),则应予以解雇

其他人建议我们采取哪些措施来防止这种情况发生。我总是在从查询窗口运行的删除中嵌入一个select,以确保它只删除我想要删除的记录。我们在生产中更改、插入或删除数据的所有代码都必须包含在事务中。如果是手动运行,则在看到受影响的记录数之前,不会运行回滚或提交

使用嵌入式select删除的示例

delete a
--select a.* from 
from table1 a 
join table 2 b on a.id = b.id
where b.somefield = 'test'
但即使是这些技术也不能防止所有人为错误。不了解数据的开发人员可能会运行select,但仍然不知道它正在删除太多的记录。在事务中运行可能意味着当人们忘记提交或回滚并锁定系统时,您会遇到其他问题。或者,人们可能会将其放在事务中,但仍会不假思索地点击提交,就像在消息框中点击确认一样。最好的预防措施是找到一种从此类错误中快速恢复的方法。从审核日志表中恢复往往比从备份中恢复快。另外,您还可以知道是谁犯了错误以及哪些记录受到了影响(可能您没有删除整个表,但是您的where子句是错误的,并且删除了一些错误的记录)

在大多数情况下,生产数据不应动态更改。您应该编写更改脚本并首先在dev上检查它。然后在prod上,您所要做的就是不做任何更改地运行脚本,而不是一次突出显示并运行一个小片段。现在在现实世界中,这并不总是可能的,因为有时你正在修正