对于我的客户,我有时会在他们的实时数据库中工作,以解决他们自己创建的问题,或者修复产品缺陷所造成的不良数据。就像Unix根访问一样,这很危险。我应该提前学习什么课程?
在操作实时数据时要注意的第一件事是什么?
对于我的客户,我有时会在他们的实时数据库中工作,以解决他们自己创建的问题,或者修复产品缺陷所造成的不良数据。就像Unix根访问一样,这很危险。我应该提前学习什么课程?
在操作实时数据时要注意的第一件事是什么?
Answers:
这些年来,我已经学到了三件事:
首先,如果要对实时数据进行更新或删除,请首先使用要使用的WHERE子句编写一个SELECT查询。确保它有效。确保它是正确的。然后将UPDATE / DELETE语句添加到已知的工作WHERE子句中。
你永远都不想拥有
DELETE FROM Customers
坐在您的查询分析器中,等待您编写WHERE子句...意外地按下“ execute”,而您刚刚杀死了Customer表。哎呀。
另外,根据您的平台,了解如何对表进行快速的“脏”备份。在SQL Server 2005中,
SELECT *
INTO CustomerBackup200810032034
FROM Customer
会将整个客户表中的每一行复制到一个名为CustomerBackup200810032034的新表中,完成更新并确保一切正常后,可以将其删除。如果发生最坏的情况,从该表恢复丢失的数据要比尝试从磁盘或磁带恢复昨晚的备份要容易得多。
最后,请警惕级联删除,以摆脱您不打算删除的内容-在修改任何内容之前检查表的关系和键约束。
BEGIN TRANSACTION;
这样,您可以在出错后回滚。
通常,在执行UPDATE或DELETE之前,我要编写等效的SELECT。
除非您处于BEGIN TRAN t1中,否则请勿进行更新-不在dev数据库中,不在生产环境中,不在任何地方。切勿在注释外部运行COMMIT TRAN t1-始终键入
--COMMIT TRAN t1
然后选择该语句以运行它。(显然,这仅适用于GUI查询客户端。)如果您执行这些操作,则成为它们的第二习惯,并且您几乎不会浪费任何时间。
实际上,我有一个键入此内容的“更新”宏。我总是将其粘贴以设置我的更新。您可以为删除和插入创建类似的内容。
begin tran t1
update
set
where
rollback tran t1
--commit tran t1
始终确保您的UPDATE和DELETE具有正确的WHERE子句。
要回答我自己的问题:
编写更新语句时,请无序写入。
UPDATE [table-name]
WHERE [conditions]
SET [columns-and-values]
在说出要更改的值之前,选择要更新的行比按其他顺序执行要安全得多。它使您不可能update person set email = 'bob@bob.com'
坐在查询窗口中,无法通过错位的按键来运行,又无法弄乱表中的每一行。
编辑:正如其他人所说,在编写WHERE
之前,先为您的删除编写子句DELETE
。
例如,我创建这样的SQL
--Update P Set
--Select ID, Name as OldName,
Name='Jones'
From Person P
Where ID = 1000
我突出显示了从最后到Select的文本并运行该SQL。一旦我确认它正在提取我要更新的记录,就按下上移键以突出显示Update语句并运行它。
请注意,我使用了别名。我从不显式更新表名。我总是使用别名。
如果结合事务和回滚/提交来执行此操作,那么我真的非常安全。
我使用实时数据库时要小心的第一方法?不要碰它 :)
备份可以消除对数据库造成的损害,但是在这段时间内您仍然可能会带来负面影响。
无论您认为所使用的脚本有多扎实,都需要在测试周期中运行它。即使“测试周期”意味着要针对自己的数据库实例运行脚本,也请确保执行此操作。在生产环境中引入缺陷比在生产环境中引入缺陷要好得多。
我发现其他一些有用的东西:
如果使用MySQL,请启用安全更新
如果您有DBA,请要求他们这样做。
我发现这三件事使我免受任何严重伤害。
好吧,这就是我现在能想到的。采取大胆的段落,您会发现对我来说最重要的是第一。;-)
如果您使用的是Oracle或其他支持它的数据库,请在执行COMMIT之前验证您的更改。
每种环境使用不同的颜色:我们已经设置了PL \ SQL开发人员(适用于Oracle的IDE),因此,当您登录到生产数据库时,所有窗口均为亮红色。有些甚至为开发和测试分配了不同的颜色。
如果要使用脚本更新数据库,请始终确保在脚本的开头放置一个或两个断点,以防万一我意外地碰到了运行/执行。