如何在 SQL Server 2008 中检索已删除的存储过程、函数、表

Posted

技术标签:

【中文标题】如何在 SQL Server 2008 中检索已删除的存储过程、函数、表【英文标题】:How to retrieve dropped stored procedure, function, table in SQL Server 2008 【发布时间】:2015-03-04 00:24:39 【问题描述】:

我验证了下面的链接,因为有人 (@Oliver) 发布了我的问题的副本。但是这个查询返回最后一个执行脚本。这与我的问题无关。

Last executed queries for a specific database

我有一个带有 Sample_Training 的数据库,我在其中创建了一个存储过程,后来我删除了它,现在我想检索那个已删除的存储过程。

我是公司的员工,所以我没有管理权限

DECLARE @Date_From DATETIME = '2015-01-02'
DECLARE @Date_To DATETIME = '2015-01-05'

SELECT 
    CONVERT(VARCHAR(MAX), SUBSTRING([RowLog Contents 0], 33, LEN([RowLog Contents 0]))) AS [Script]
FROM
    fn_dblog(NULL,NULL)
WHERE 
    [Operation] = 'LOP_DELETE_ROWS' 
    AND [Context] = 'LCX_MARK_AS_GHOST'
    AND [AllocUnitName] = 'sys.sysobjvalues.clst'
    AND [TRANSACTION ID] IN (SELECT DISTINCT [TRANSACTION ID] 
                             FROM sys.fn_dblog(NULL, NULL)
                             WHERE Context IN ('LCX_NULL') AND Operation IN ('LOP_BEGIN_XACT') 
                               AND [Transaction Name] = 'DROPOBJ'
                               AND CONVERT(NVARCHAR(11), [Begin Time]) BETWEEN @Date_From AND @Date_To)
                               AND SUBSTRING([RowLog Contents 0], 33, LEN([RowLog Contents 0])) <> 0

通过上面的查询我可以得到存储过程,现在我的问题是如何得到函数,表。

【问题讨论】:

既然你是一家公司的员工,我相信这家公司足够专业,有一个源代码控制系统,而你'足够专业,可以检查您的 SQL 脚本 --> 只需从源代码管理中检索创建该存储过程的脚本并再次运行它 - 完成! Last executed queries for a specific database的可能重复 首先检查您提到的查询重复。它将给出最后执行查询。我不是在询问最后一次执行查询。如果您有 SSMS,只需运行我的查询并检查结果。 @奥利弗 raresql.com/tag/how-to-recover-the-deleted-stored-procedure 【参考方案1】:

我的问题得到了解决方案。首先需要创建一个程序

CREATE PROCEDURE [dbo].[sp_Recover_Dropped_Objects]
    @Database_Name NVARCHAR(MAX),
    @Date_From DATETIME,
    @Date_To DATETIME
AS

DECLARE @Compatibility_Level INT

SELECT @Compatibility_Level=dtb.compatibility_level
FROM master.sys.databases AS dtb WHERE dtb.name=@Database_Name

IF ISNULL(@Compatibility_Level,0)<=80
BEGIN
    RAISERROR('The compatibility level should be equal to or greater SQL SERVER 2005 (90)',16,1)
    RETURN
END

Select [Database Name],Convert(varchar(Max),Substring([RowLog Contents 0],33,LEN([RowLog Contents 0]))) as [Script]
from fn_dblog(NULL,NULL)
Where [Operation]='LOP_DELETE_ROWS' And [Context]='LCX_MARK_AS_GHOST'
And [AllocUnitName]='sys.sysobjvalues.clst'
AND [TRANSACTION ID] IN (SELECT DISTINCT [TRANSACTION ID] FROM    sys.fn_dblog(NULL, NULL)
WHERE Context IN ('LCX_NULL') AND Operation in ('LOP_BEGIN_XACT') 
And [Transaction Name]='DROPOBJ'
And  CONVERT(NVARCHAR(11),[Begin Time]) BETWEEN @Date_From AND @Date_To)
And Substring([RowLog Contents 0],33,LEN([RowLog Contents 0]))<>0

执行如下程序

EXEC sp_Recover_Dropped_Objects 'Sample_Training','2015/12/24','2015/01/07'

【讨论】:

非常好的答案。这对于查看发生的变化也很有用。 dba.stackexchange.com/a/10718/79884 我处于同样的情况,我需要恢复一小时前我在 sql 2014 中丢弃的存储过程。任何人都可以帮助我 谢谢你救了我的命

以上是关于如何在 SQL Server 2008 中检索已删除的存储过程、函数、表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组

从 SQL Server 2008 R2 检索多语言数据(中文、日文...)并在 Java webapp 中显示

如何使用 Sql Server 2008 获取用于插入到 select 中的 scope_identity 列表?

SQL2008和sql2008 r2有啥区别

检索sql server中新插入行的值

如何在 SQL Server 2008 中恢复 SQL Server 2014 备份