如何在SQL Server 2008中找回被删除的存储过程、函数和表

11
我验证了下面的链接,因为有人(@Oliver)将其发布为我的问题的重复。但是这个查询返回上次执行的脚本,与我的问题无关。

特定数据库的最后执行查询

我有一个名为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

通过上面的查询,我可以得到存储过程,那么我的问题是如何获取函数、表。


3
既然您是一家公司的员工,我相信这家公司很专业,会有源代码控制系统;而您也很专业,能够将SQL脚本提交到源代码控制系统中。只要从源代码控制系统中检索创建该存储过程的脚本,然后再次运行即可-完成! - marc_s
可能是特定数据库的最后执行查询的重复问题。 - Oliver
首先检查您提到的重复查询。这将提供最后执行的查询。我不是在询问最后执行的查询。如果您有SSMS,请运行我的查询并检查结果。@Oliver - Dinesh Reddy Alla
1
http://raresql.com/tag/how-to-recover-the-deleted-stored-procedure/ - Mohit
1个回答

25

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

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'

非常好的答案。此外,查看发生了哪些更改也很有用。http://dba.stackexchange.com/a/10718/79884 - user586399
1
我和你处于同样的情况,我需要在SQL 2014中恢复一个小时前被我删除的存储过程。有人能帮我吗? - karunakar bhogyari
谢谢你,你救了我的命。 - Jonathan Moy
这对我没有起作用。经过一些尝试,似乎只有相当小的存储过程才能正常工作。我没有精确确定,但我的猜测是它只适用于小于Nnvarchar(max)的Sps。 - TizzyFoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接