7

Tôi đã xác minh liên kết bên dưới là một số (@Oliver) được đăng trùng lặp với Câu hỏi của tôi. Nhưng truy vấn này trả về tập lệnh thực thi cuối cùng. Nó không liên quan đến câu hỏi của tôi.Cách lấy lại các thủ tục, hàm, bảng đã lưu bị bỏ trong SQL Server 2008

Last executed queries for a specific database

Tôi có một cơ sở dữ liệu với Sample_Training và tôi đã tạo ra một thủ tục lưu trữ trong đó và sau này tôi đã xóa nó và bây giờ tôi muốn lấy mà thủ tục lưu trữ đã bị xóa.

Tôi nhân viên trong công ty vì vậy mà tôi không có quyền hành chính

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 

Bằng các truy vấn trên tôi có thể được lưu trữ thủ tục và bây giờ câu hỏi của tôi là làm thế nào để có được chức năng, bảng.

+3

Vì bạn * nhân viên của một công ty *, Tôi chắc chắn rằng công ty là đủ chuyên nghiệp để có một ** nguồn kiểm soát ** hệ thống, và bạn đủ chuyên nghiệp để kiểm tra các kịch bản lệnh SQL của bạn -> chỉ cần truy xuất tập lệnh tạo ra thủ tục được lưu trữ đó từ điều khiển nguồn và chạy lại nó - xong! –

+0

có thể trùng lặp của [Truy vấn được thực hiện lần cuối cho một cơ sở dữ liệu cụ thể] (http://stackoverflow.com/questions/13638435/last-executed-queries-for-a-specific-database) – Oliver

+0

Trước tiên hãy kiểm tra truy vấn những gì bạn đã đề cập là trùng lặp . Nó sẽ cung cấp cho Query Execution Query. Tôi không yêu cầu truy vấn cuối cùng. Nếu bạn có SSMS chỉ cần chạy truy vấn của tôi và kiểm tra kết quả. @Oliver –

Trả lời

14

Tôi nhận Giải pháp cho câu hỏi của mình. Đầu tiên cần tạo một thủ tục

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 [email protected]_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 

Thực hiện các thủ tục như sau

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

Câu trả lời rất hay. Điều này cũng hữu ích để xem những thay đổi nào đã xảy ra. http://dba.stackexchange.com/a/10718/79884 –

+0

Cảm ơn bạn. http://dba.stackexchange.com/a/10718/79884 –

Các vấn đề liên quan