您使用实时数据库时要注意的第一方法是什么?[关闭]


80

对于我的客户,我有时会在他们的实时数据库中工作,以解决他们自己创建的问题,或者修复产品缺陷所造成的不良数据。就像Unix根访问一样,这很危险。我应该提前学习什么课程?

在操作实时数据时要注意的第一件事是什么?

Answers:


101

这些年来,我已经学到了三件事:

首先,如果要对实时数据进行更新或删除,请首先使用要使用的WHERE子句编写一个SELECT查询。确保它有效。确保它是正确的。然后将UPDATE / DELETE语句添加到已知的工作WHERE子句中。

你永远都不想拥有

DELETE FROM Customers

坐在您的查询分析器中,等待您编写WHERE子句...意外地按下“ execute”,而您刚刚杀死了Customer表。哎呀。

另外,根据您的平台,了解如何对表进行快速的“脏”备份。在SQL Server 2005中,

SELECT *
INTO CustomerBackup200810032034
FROM Customer

会将整个客户表中的每一行复制到一个名为CustomerBackup200810032034的新表中,完成更新并确保一切正常后,可以将其删除。如果发生最坏的情况,从该表恢复丢失的数据要比尝试从磁盘或磁带恢复昨晚的备份要容易得多。

最后,请警惕级联删除,以摆脱您不打算删除的内容-在修改任何内容之前检查表的关系和键约束。


1
您是不是
要从

5
或者更好的是不要使用级联任何东西。
dkretz

108
BEGIN TRANSACTION;

这样,您可以在出错后回滚。


是的,几乎是防止脸部疯狂的唯一方法。
willasaywhat

11
@Graeme,您不应该在生产数据库上执行DDL。您应该编写一个脚本,在测试数据库上运行它,然后在测试数据库通过质量检查后,再在生产服务器上运行它。
Paul Tomblin,

1
@Paul:绝对。但是可以说,您应该对生产数据库进行任何形式的修改,无论是DDL还是DML,在这种情况下,整个问题都是没有意义的。
Graeme Perrow

3
爱德华多(Eduardo)迄今获得了45票,这是因为-在大多数情况下-您的冷汗开始于手指完全滑下键盘之前-但为时已晚,无法停止手指。
Euro Micelli

1
这样做还很有用,因为您可以在同一事务中运行一堆选择,以在提交之前验证结果-如果它们是意外的,则不会造成危害-只需回滚即可。
戴夫·克吕德雷

50

首先进行备份:无论如何,它应该是系统管理的第一法则

编辑:结合他人所说的内容,确保您的UPDATES具有适当的WHERE子句。

理想情况下,绝不应该更改活动数据库(除了INSERT和基本维护之外)。更改活动数据库的结构尤其充满潜在的不良业障。


25

对副本进行更改,并在满意后将其应用于实时环境。


在大多数情况下,copy db与live并不相同,并非所有更改都与copy and live相同。
bugBurger

如果复制数据库与实时数据库不同,那不是意味着它实际上不是复制数据库吗?测试/质量保证/副本数据库的全部目的是在将更改应用于实时/生产数据库之前对其进行测试。
Wilco

22

通常,在执行UPDATE或DELETE之前,我要编写等效的SELECT。


作为快速简单的检查,我也喜欢这种方法。根据结果​​的数量,它可能不起作用,但至少它是UPDATES和DELETES的开始。
osp70

18

除非您处于BEGIN TRAN t1中,否则请勿进行更新-不在dev数据库中,不在生产环境中,不在任何地方。切勿在注释外部运行COMMIT TRAN t1-始终键入

--COMMIT TRAN t1

然后选择该语句以运行它。(显然,这仅适用于GUI查询客户端。)如果您执行这些操作,则成为它们的第二习惯,并且您几乎不会浪费任何时间。

实际上,我有一个键入此内容的“更新”宏。我总是将其粘贴以设置我的更新。您可以为删除和插入创建类似的内容。

begin tran t1
update 
set 
where 
rollback tran t1
--commit tran t1

是的,这正是我的工作。太多的人在说“别忘了where子句”,但是如果错了怎么办?永远不要在没有这种开始/回滚/-提交模式的情况下更新实时数据库。
Eric Z Beard

另一个改进是首先使用where子句执行“ select * from”以确保它是正确的,然后使用相同的where子句运行更新。
Eric Z Beard

埃里克(Eric)是对的,尽管我将其放在宏之外以避免范围蔓延。我还有另一个宏,它键入“ select * from”以供一般使用。
Patrick Szalapski

没有充分的理由不这样做。当我不得不在上一份工作中编写更新脚本时,我以这种方式进行操作,同时在更新之前进行了SELECT 在更新之后进行了SELECT ,以便可以看到结果。运行几次并看到结果正确后,我将ROLLBACK更改为COMMIT。
瑞安·伦迪

13

始终确保您的UPDATE和DELETE具有正确的WHERE子句。


是的,我以前对此很着迷。
伊恩·雅各布斯

我也是。从那时起,我一直希望对SQL进行设计,以便将where子句放在首位。
格雷格(Greg Hewgill)

当执行快速更新时,一定会喜欢这种沉没的感觉,并说“ 1279209394记录受到影响”。哦哦 ;)
Kevin Fairchild

13

要回答我自己的问题:

编写更新语句时,请无序写入。

  1. UPDATE [table-name]
  2. WHERE [conditions]
  3. 回去写 SET [columns-and-values]

在说出要更改的值之前,选择要更新的行比按其他顺序执行要安全得多。它使您不可能update person set email = 'bob@bob.com'坐在查询窗口中,无法通过错位的按键来运行,又无法弄乱表中的每一行。

编辑:正如其他人所说,在编写WHERE之前,先为您的删除编写子句DELETE


11

例如,我创建这样的SQL

--Update P Set
--Select ID, Name as OldName, 
    Name='Jones'
From Person P
Where ID = 1000

我突出显示了从最后到Select的文本并运行该SQL。一旦我确认它正在提取我要更新的记录,就按下上移键以突出显示Update语句并运行它。

请注意,我使用了别名。我从不显式更新表名。我总是使用别名。

如果结合事务和回滚/提交来执行此操作,那么我真的非常安全。


我还使用了选择检查-这样就捕获了几个where子句错误。这是一个很好的健全性检查,尤其是在语句复杂时。
鲍勃·普罗布斯特

在观看我的主管在一天中的中间删除重要的生产表之后,这种方法在短时间内得到了磨练。
wcm

我切换选择并更新并删除选择上的注释。然后,当我准备好时,我突出显示该区域并运行。也适用于删除。
rball

11

我使用实时数据库时要小心的第一方法?不要碰它 :)

备份可以消除对数据库造成的损害,但是在这段时间内您仍然可能会带来负面影响。

无论您认为所使用的脚本有多扎实,都需要在测试周期中运行它。即使“测试周期”意味着要针对自己的数据库实例运行脚本,也请确保执行此操作。在生产环境中引入缺陷比在生产环境中引入缺陷要好得多。


6
  1. 检查,重新检查并再次检查正在执行更新的任何陈述。即使您认为您只是在进行简单的单列更新,迟早您也不会喝足够的咖啡,而忘记了“ where”子句,从而破坏了整个表。

我发现其他一些有用的东西:

  • 如果使用MySQL,请启用安全更新

  • 如果您有DBA,请要求他们这样做。

我发现这三件事使我免受任何严重伤害。


是的,经典:UPDATE TABLE_NAME SET FIELD_X ='whatever'[WHERE = missing]
Stefan Steiger

6
  • 没有人想要备份,但每个人都在呼吁恢复
  • 使用外键引用创建数据库,因为您应该:
  • 使自己尽可能难以更新/删除数据并破坏结构完整性/
  • 如果可能,请在必须永久保存更改之前提交更改的系统上运行(即,在修复数据库时停用自动提交)
  • 尝试确定问题的类别,以便您了解如何轻松解决问题
  • 获得在数据库中播放备份的例程,始终在测试服务器上拥有另一个数据库,以便您可以在其中进行工作
  • 因为请记住:如果某件事完全失败,则需要尽快重新启动并运行

好吧,这就是我现在能想到的。采取大胆的段落,您会发现对我来说最重要的是第一。;-)


我想补充一下自动提交,因为它是重要的安全机制。如果直接连接到数据库,通常可以在db连接参数中关闭自动提交。否则(数据库前端产品),您可能需要查找应用程序设置。
Mike Monette

3

也许考虑根本不使用任何删除或删除。或者降低用户权限,以便只有特殊的数据库用户才能删除/删除内容。


3

如果您使用的是Oracle或其他支持它的数据库,请在执行COMMIT之前验证您的更改。


您必须小心,因为在事务挂起时记录可能被锁定。
格雷格·奥格尔

我通常将SQL Developer用于oracle,即使执行后也不会自动提交。因此,我们进行了预览,然后提交。很酷的功能!
lakshminb7

3

应始终通过脚本将数据部署为实时运行,脚本可以根据需要进行多次演练,以使其在开发人员中正常使用。当脚本具有相关数据才能在dev上正确运行时,请适当地暂存它-如果您确实要小心,就无法逃避此步骤。




2

要添加@ Wayne所说的内容,请WHEREDELETEorUPDATE语句中的表名称前写上your 。


2

备份您的数据。了解到这是一种定期使用客户数据库的困难方式。



2

我的规则(作为应用程序开发人员):不要碰它!那就是训练有素的DBA的目的。哎呀,我什至都不想要触摸它。:)


2

每种环境使用不同的颜色:我们已经设置了PL \ SQL开发人员(适用于Oracle的IDE),因此,当您登录到生产数据库时,所有窗口均为亮红色。有些甚至为开发和测试分配了不同的颜色。




1
  1. 如果可能的话,要求与某人配对
  2. 在按Enter键之前始终计数到3(如果单独使用,因为这会激怒您的伴侣!)

1

如果要使用脚本更新数据库,请始终确保在脚本的开头放置一个或两个断点,以防万一我意外地碰到了运行/执行。


1

在更新之前,我将建议您进行BEGIN TRAN,只是不要忘记实际执行COMMIT;如果您保留未提交的交易,可能会造成同样多的损失。在更新过程中,请勿因电话,同事,午餐等而分心,否则您会发现其他所有人都被锁定,直到您提交或回滚为止。


1

在Query Analyzer中写出特别查询时,我总是注释掉所有破坏性查询(插入,更新,删除,删除,更改)。这样,运行它们的唯一方法是突出显示它们,而不选择注释的部分,然后按F5。

如前所述,我还认为这是一个好主意,首先使用select编写您的where语句,并确保您正在更改正确的数据。


1
  1. 更改之前,请始终备份。
  2. 始终通过脚本制作mod(例如,ALTER TABLE)。
  3. 始终通过存储过程修改数据(例如DELETE)。

1

创建一个只读用户(或让DBA这样做),并且仅使用该用户查看数据库。向架构添加适当的权限,以便您可以查看存储过程/视图/触发器/等的内容。但无法更改它们。

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.