在任何 RESTORE DATABASE 事件后自动执行存储过程

Mat*_*ton 9 sql-server sql-server-2008-r2

是否可以让SQL Server 2008 R2 Standard在任何已还原附加到实例的给定数据库中自动执行存储过程?

我已经通过创建服务器级触发器接近解决方案,该触发器在 DDL 事件CREATE_DATABASE或被ALTER_DATABASE触发后执行给定数据库中的存储过程。不幸的是,这不适用于数据备份恢复。

详细地说,我们有一个“清理”存储过程,它存在于我们恢复的每个数据库中,我正在寻找一种方法,每当备份恢复到实例时自动执行此过程。

谷歌搜索指出我可以在 SQL Server 中配置审计策略来获得此功能,但这些功能乍一看非常令人难以抗拒,所以我不知道审计或策略是否是开始调查的途径。

Aar*_*and 10

是否必须在还原完成后立即执行,还是可以短暂延迟?我的一个想法是让作业每分钟运行一次,并检查Audit Backup/Restore Event默认跟踪中的 。

DECLARE @fn VARCHAR(MAX);

SELECT @fn = SUBSTRING([path], 0, LEN([path])-CHARINDEX(CHAR(92), REVERSE([path]))+1) 
  + CHAR(92) + 'Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT 
    DatabaseName,
    StartTime, 
    TextData
FROM sys.fn_trace_gettable(@fn, DEFAULT)  
WHERE EventClass = 115
AND TextData LIKE '%RESTORE%'; -- since can't differentiate between backup/restore
Run Code Online (Sandbox Code Playgroud)

您可以根据 StartTime 存储您已经完成的清理,甚至限制每分钟运行的跟踪查询(或任何您可接受的延迟阈值)只查看大于您拉取的最后一行或最后一行的 StartTime 值作业运行的时间,以较短者为准。


Jon*_*gel 6

database_started 扩展事件还原数据库之后被激发。

创建一个事件会话可捕获database_id与谓词场,看起来对%RESTORE%sql_text外地(注:我相信这是不够的-你要自己试一试)。

我对扩展事件不够熟悉,无法告诉您如何响应事件的最佳方式。如果您可以直接触发存储过程,那就太好了;不过我不知道这是否可能。但是,您当然可以轮询事件缓冲区,这比扫描默认跟踪更可取——不仅出于性能原因,而且如果服务器非常繁忙且轮询间隔太长,您最终可能会完全丢失事件。使用扩展事件方法,错过事件的可能性很小。