2014-09-25 177 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删除对象的位置。