【发布时间】:2023-03-16 01:08:02
【问题描述】:
对于我的客户,我偶尔会在他们的实时数据库中工作,以解决他们为自己创建的问题,或修复我的产品错误造成的不良数据。就像 Unix root 访问一样,这很危险。我应该提前学习哪些课程?
在对实时数据进行操作时要小心操作的第一件事是什么?
【问题讨论】:
标签: database
对于我的客户,我偶尔会在他们的实时数据库中工作,以解决他们为自己创建的问题,或修复我的产品错误造成的不良数据。就像 Unix root 访问一样,这很危险。我应该提前学习哪些课程?
在对实时数据进行操作时要小心操作的第一件事是什么?
【问题讨论】:
标签: database
BEGIN TRANSACTION;
这样你可以在出错后回滚。
【讨论】:
这些年来我学到了三件事……
首先,如果您要对实时数据进行更新或删除,请首先使用您将使用的 WHERE 子句编写一个 SELECT 查询。确保它有效。确保它是正确的。然后将 UPDATE/DELETE 语句添加到已知的工作 WHERE 子句。
你永远不想拥有
DELETE FROM Customers
坐在您的查询分析器中等待您编写 WHERE 子句...不小心点击了“执行”,而您刚刚杀死了您的 Customer 表。哎呀。
此外,根据您的平台,了解如何快速备份表格。在 SQL Server 2005 中,
SELECT *
INTO CustomerBackup200810032034
FROM Customer
会将整个 Customer 表中的每一行复制到一个名为 CustomerBackup200810032034 的新表中,然后您可以在完成更新并确保一切正常后将其删除。如果发生最坏的情况,从该表中恢复丢失的数据比尝试从磁盘或磁带恢复昨晚的备份要容易得多。
最后,小心级联删除删除您不打算删除的内容 - 在修改任何内容之前检查表的关系和键约束。
【讨论】:
先做备份:无论如何,这应该是系统管理的第一法则
编辑:结合其他人所说的,确保您的更新有适当的 WHERE 子句。
理想情况下,永远不要更改实时数据库(除了插入和基本维护)。更改实时数据库的结构尤其充满了潜在的不良业力。
【讨论】:
对副本进行更改,当您满意时,将修复应用到实时版本。
【讨论】:
通常在执行 UPDATE 或 DELETE 之前,我会编写等效的 SELECT。
【讨论】:
除非您在 BEGIN TRAN t1 中,否则切勿进行更新——不在开发数据库中,不在生产环境中,不在任何地方。永远不要在注释之外运行 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' 不可能坐在您的查询窗口中,随时准备被错误的击键运行,准备弄乱表格中的每一行。
编辑:正如其他人所说,在编写 DELETE 之前为您的删除编写 WHERE 子句。
【讨论】:
例如,我这样创建 SQL
--Update P Set
--Select ID, Name as OldName,
Name='Jones'
From Person P
Where ID = 1000
我突出显示从末尾到 Select 的文本并运行该 SQL。一旦我确认它正在提取我想要更新的记录,我点击 shift-up 以突出显示 Update 语句并运行它。
请注意,我使用了别名。我从不明确更新表名。我总是使用别名。
如果我结合事务和回滚/提交来执行此操作,我真的非常安全。
【讨论】:
小心使用实时数据库的#1 方法是什么?不要碰它。 :)
备份可以消除您对数据库造成的损害,但您仍然可能在这段时间内引入负面影响。
无论您认为您正在使用的脚本有多可靠,都要通过一个测试周期来运行它。即使“测试周期”意味着针对您自己的数据库实例运行脚本,请确保您这样做。在本地机器上引入缺陷比在生产环境中引入缺陷要好得多。
【讨论】:
我发现其他一些有用的东西:
如果使用 MySQL,请启用 Safe updates
如果您有 DBA,请让他们去做。
我发现这 3 件事使我没有造成任何严重伤害。
【讨论】:
嗯,这就是我现在能想到的。采取大胆的段落,你会看到我的第一件事。 ;-)
【讨论】:
也许考虑不使用任何删除或删除。或者可能减少用户权限,以便只有特殊的数据库用户可以删除/删除东西。
【讨论】:
如果您使用的是 Oracle 或其他支持它的数据库,请在执行 COMMIT 之前验证您的更改。
【讨论】:
数据应始终通过脚本进行部署,以便在开发人员中正确执行所需的次数。当脚本有依赖数据可以在 dev 上正确运行时,适当地暂存它——如果你真的想小心的话,你不能逃脱这一步。
【讨论】:
检查两次,提交一次!
【讨论】:
开始前备份或转储数据库。
【讨论】:
要补充@Wayne 所说的内容,请在DELETE 或UPDATE 语句中的表名前写上您的WHERE。
【讨论】:
备份您的数据。定期与客户数据库打交道是一项艰巨的任务。
【讨论】:
始终添加 using 子句。
【讨论】:
我的规则(作为应用开发者):不要碰它!这就是训练有素的 DBA 的用途。哎呀,我什至不想允许触摸它。 :)
【讨论】:
每个环境有不同的颜色:我们设置了我们的 PL\SQL 开发人员(适用于 Oracle 的 IDE),因此当您登录到生产数据库时,所有窗口都显示为鲜红色。有些甚至还为开发和测试分配了不同的颜色。
【讨论】:
确保在删除记录时指定 where 子句。
【讨论】:
始终首先在开发数据上测试除 select 之外的任何查询,以确保其产生正确的影响。
【讨论】:
【讨论】:
如果我使用脚本更新数据库,我总是确保在脚本的开头放置一个或两个断点,以防我意外运行/执行。
【讨论】:
我会在你的 UPDATE 之前添加 BEGIN TRAN 的建议,只是不要忘记实际执行 COMMIT;如果您将未提交的交易保持打开状态,您可能会造成同样多的损害。在更新过程中不要被电话、同事、午餐等分心,否则您会发现其他人都被锁定,直到您提交或回滚。
【讨论】:
在查询分析器中写出即席查询时,我总是注释掉任何破坏性查询(插入、更新、删除、删除、更改)。这样,运行它们的唯一方法是突出显示它们,而不选择注释部分,然后按 F5。
我还认为,如前所述,首先编写 where 语句,使用 select 并确保更改正确的数据是一个好主意。
【讨论】:
【讨论】:
创建一个只读用户(或让 DBA 来做)并只使用该用户查看数据库。为架构添加适当的权限,以便您可以查看存储过程/视图/触发器/等的内容。但没有能力改变它们。
【讨论】: