撤消对存储过程的更改

时间:2011-07-18 21:59:18

标签: sql sql-server-2005 stored-procedures recovery data-recovery

我改变了存储过程,并在不知不觉中覆盖了另一个开发人员对其进行的一些更改。有没有办法撤消更改并恢复旧脚本?

不幸的是,我没有该数据库的备份,因此排除了该选项。

7 个答案:

答案 0 :(得分:8)

答案是,你可以取回它,但这并不容易。所有数据库都记录对其进行的每次更改。你需要:

  1. 关闭服务器(或至少将其置于只读模式)
  2. 完整备份服务器
  3. 获取事故发生之前所有数据库日志文件的副本
  4. 将备份还原到另一台服务器
  5. 使用数据库管理工具,回滚日志文件,直至“撤消”事故
  6. 检查存储过程中恢复的代码并将其重新编码为当前版本
  7. 最重要的是:根据源控制获取您的存储过程代码

    大多数人都没有“理解”这个概念:你只能对数据库进行更改;您不能像应用程序代码一样回滚代码版本。要“回滚”,您必须进行更多更改并删除/定义存储过程(或其他)。

    对nitpickers的注意:通过“回滚”我并不是指“交易回滚”。我的意思是你已经做出了改变,并决定服务器回来了,改变是不好的。

答案 1 :(得分:3)

除了使用备份或从源代码控制中恢复的合理建议之外(如果你不做这些事情,你需要启动),你也可以考虑从{{{{}}获取SSMS Tools Pack 3}}。他的Management Studio加载项允许您保留您已经处理或执行的所有查询的运行历史记录,因此很容易回到过去并查看以前的版本。虽然如果其他人在最后一个已知的好版本上工作,这对你没有帮助,如果你的整个团队都在使用它,那么任何人都可以回去查看已执行的任何版本。您可以指定保存的位置(到您自己的文件系统,网络共享或数据库),并微调自动保存的频率。真正无价的功能,特别是如果您对备份和/或懒惰源代码控制(尽管如此,我强调,你应该在再次触摸生产服务器之前做这些事情。)

答案 2 :(得分:2)

“有没有办法撤消更改并恢复旧脚本?”

简短回答:不。

: - (

答案 3 :(得分:2)

你将无法从数据库方面取回它。此时您的选择几乎仅限于1)从备份中恢复,2)转到源代码控制或3)希望其他人在某个编辑器中仍然存在副本或保存到文件中。

如果这些都不是您的选择,那么这里必须“您应该定期备份并使用源代码管理”....

答案 4 :(得分:2)

您可以查看缓存的执行计划,并尝试找到您的同事进行更改并再次运行相关部分的计划。

修改

虽然如果你在TL中有变化,波西米亚人看起来会有一个很好的答案,this就是我所说的。查看计划的SQL文本。

SELECT  cached.*,
               sqltext.*
         FROM  sys.dm_exec_cached_plans cached
  CROSS APPLY  sys.dm_exec_sql_text (cached.plan_handle) AS sqltext

但正如squillman指出的那样,DDL没有执行计划。

答案 5 :(得分:1)

我在游戏方面已经迟到了,但今天早上我做了同样的事情,发现我忘了在过去的某个时刻保存我的脚本并需要恢复它。 (完成此操作后,它将在源代码管理中进行!!!)

有些人提到从备份中恢复,但没有人真的提到如果你有备份是多么容易。此外,您不会被锁定回滚生产数据库。我认为这是关键,假设你有一个备份,我会说这是一个更好的替代选择投票到最佳答案。

您所要做的就是备份并将其恢复到新的数据库。拉出你正在寻找的sp,瞧,你已经恢复了丢失的代码。

在恢复丢失的文件后,不要忘记删除新创建的数据库。

答案 6 :(得分:0)

我遇到了同样的问题,我没有信心从日志文件恢复到另一台服务器。在我意识到解决方案非常简单之前,我非常烦恼......

反复按Ctrl-Z直到我撤消更改并再次运行ALTER PROCEDURE。

不可否认,我很幸运,我仍然在那里恢复,但它确实是最简单的修复。现在可能有点晚了。