我在一个内部测试数据库中犯了一个愚蠢的错误。我正在更新我刚刚添加的记录,因为我输入了一个错字但导致许多记录被更新,因为在where子句中我使用了外键而不是我刚添加的特定记录的唯一ID
我们的一位高级开发人员告诉我做一个select来测试它在实际编辑之前会影响哪些行。除此之外,有没有办法可以执行你的查询,看到结果,但没有让它提交到数据库,直到我告诉它这样做?下次我可能没那么幸运。只有高级开发人员可以进行实时更新,这是一个很好的工作!
答案 0 :(得分:8)
在我看来,你只需养成开展交易的习惯:
BEGIN TRANSACTION;
UPDATE [TABLENAME]
SET [Col1] = 'something', [Col2] = '..'
OUTPUT DELETED.*, INSERTED.* -- So you can see what your update did
WHERE ....;
ROLLBACK;
比你看到结果后再次运行,将ROLLBACK改为COMMIT,你就完成了!
如果您使用的是Microsoft SQL Server Management Studio,则可以转到Tools > Options... > Query Execution > ANSI > SET IMPLICIT_TRANSACTIONS
,SSMS将自动为您打开交易。只是不要忘记在必要时提交,并且在不提交/回滚关闭连接时可能阻止其他连接。
答案 1 :(得分:5)
首先假设你在更新数据库时会犯一个错误,所以永远不要这样做,除非你知道如何恢复,如果你没有运行代码,
最重要的想法是它是一个开发数据库,希望它被弄乱 - 所以请确保你有一个快速的方法来重新加载它。
首先执行选择始终是一个好主意,看看哪些行受到影响。
然而,为了更快地回到数据库的良好状态,无论如何我都会这样做
进行简单的更新等
使用交易
执行begin transaction
然后执行所有更新等,然后选择检查数据
在您执行最后一次提交之前,只有在您确定所有操作都正确或回滚到达开头状态时才会看到数据库不会受到影响。
答案 2 :(得分:0)
如果必须在生产数据库中进行测试并且具有必需的权限,则编写查询以创建和使用临时表,这些临时表的名称与生产表类似,并且其索引名称以外的模式相同。索引名称在数据库中是唯一的,至少在Informix上是唯一的。
然后运行查询并查看数据。
除此之外,恕我直言,你需要一个开发数据库,甚至可能是一个带有开发实例的开发服务器。这是一个偏执的建议,但是你必须非常小心,即使你被允许 - 这里是MS SQLSERVER术语 - 同一服务器上的第二个实例。
我可以随意重新加载我们的测试数据库,这就是为什么我们有一个测试系统。我们的生产系统包含公民'税收和其他不能受到伤害的信息,或者其他"。
答案 3 :(得分:0)
对于我们的生产数据更改,我们始终确保使用BEGIN TRAN
和ROLLBACK TRAN
,然后所有语句都有OUTPUT
子句。这样我们就可以先运行脚本(通常先在PRODUCTION db的副本中),然后在将ROLLBACK TRAN
更改为COMMIT TRAN
答案 4 :(得分:0)
explain
吗?如果命令中有错误,它会像通常的命令一样报告。
但是如果没有错误它不会运行命令,它只会解释它。
“通过”测试的示例:
testdb=# explain select * from sometable ;
QUERY PLAN
------------------------------------------------------------
Seq Scan on sometable (cost=0.00..12.60 rows=260 width=278)
(1 row)
“失败”测试的示例:
testdb=# explain select * from sometaaable ;
ERROR: relation "sometaaable" does not exist
LINE 1: explain select * from sometaaable ;
它也适用于 insert
、update
和 delete
(即“危险的”)