2014-09-25 223 views
1

我最近開始支持在SQL Server 2008 R2中爲其維護數據庫的項目。SQL Server代理作業失敗

有一個SQL服務器代理DBMR作業在幾天前一直運行良好。現在,它一直在失敗,錯誤「無法找到存儲過程'XXX'」。當我查看主數據庫時,該過程不存在。

有沒有一種方式(日誌或事件查看器像應用程序)從SQL Server管理工作室我可以找出SP最近是否已被某人刪除?

根據一個強有力的假設,沒有人會刪除任何SP ..我真的很困惑這個工作如何運行良好,直到2天,現在失敗。任何建議/想法的歡迎。謝謝。

+0

可能有機會更改此作業所運行的用戶的權限可能導致此問題。請DBA's檢查該SP是否存在。如果他們表示不存在,那麼其中一個已被刪除,否則要求他們授予更早的權限。 – 2014-09-25 10:58:33

+0

權限不是問題,因爲在同一用戶下很少有其他工作正常運行。 – Xavi 2014-09-25 11:06:23

+0

對於您的信息,每個對象可以有不同的權限,當然我們必須從DBA獲得確認。 – 2014-09-25 11:07:49

回答

1

謝謝大家的建議/答案。

我們的一位工程師試圖安裝不同的DBMR版本,並刪除了一些作業,SP等。對不起,如果浪費你的時間。

1
SELECT * FROM sys.fn_dblog(NULL, NULL); 

使用上面的查詢,您將能夠識別下降存儲過程描述了使用

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 '2013/07/31' AND '2015/08/1') AND SUBSTRING([RowLog Contents 0], 33, LEN([RowLog Contents 0])) <> 0; 

上面粘貼的查詢,您可以重新生成刪除程序

爲安全起見,我已採​​取從2013年到2015年的日期開始時間,所以結果集應包括所有丟棄的程序(對象)

希望這會幫助你

更多閱讀

https://serverfault.com/questions/69056/how-to-find-when-the-stored-procedure-was-deleted-and-who-deleted-it

http://solutioncenter.apexsql.com/recover-a-specific-dropped-object/

http://solutioncenter.apexsql.com/how-to-recover-stored-procedures-functions-and-triggers/

1

您可以使用該功能fn_dblog

SELECT 
    Operation, 
    [Transaction Id], 
    SUSER_SNAME([Transaction SID]), 
    [Transaction Name], 
    [Begin Time], 
    [SPID], 
    Description 
FROM fn_dblog (NULL, NULL) 
WHERE [Transaction Name] = 'DROPOBJ' 
GO 

在databa執行此se刪除對象的位置。