谁更改/修改了 SSMS 2005 或 2008 中的存储过程?

Use*_*ith 5 sql-server-2005 sql-server-2008 sql-server stored-procedures

可能的重复:
确定架构更改是如何发生的?

我有一个存储过程,它在昨晚深夜修改过,早上大部分时间都在跟踪问题回到这个变化。

基本上没有人承认这一变化,所以我试图弄清楚如何找到谁修改了这个存储过程。我已经在网上研究过如何找到它,但看起来这是不可能的?

我想如果有人知道如何做到这一点,那就是这里的某个人。

我确实尝试过这个。:

“在 SSMS 中,右键单击服务器名称,选择报告/标准报告/架构更改历史记录。” --> 这没有给我任何东西,但我至少能够运行它,这为我提供了时间。

select name, create_date, modify_date
from sys.procedures
where name = 'mystoredprocedure'
Run Code Online (Sandbox Code Playgroud)

感谢您的任何建议或方向。

Han*_*non 8

我知道这并不能解决您当前的问题,但是,主动管理此类事件的最佳方法可能是创建一个 DDL 数据库触发器,将事件记录到设计日志表中,例如:

CREATE TABLE dbo.DesignLog(
    DesignLogID int NOT NULL PRIMARY KEY CONSTRAINT PK_DesignLog IDENTITY(1,1),
    DateStamp datetime NULL CONSTRAINT DF_DesignLog_DateStamp  DEFAULT (getdate()),
    HostName nvarchar(255) NULL CONSTRAINT DF_DesignLog_HostName  DEFAULT (host_name()),
    UserName nvarchar(255) NULL CONSTRAINT DF_DesignLog_UserName  DEFAULT (suser_sname()),
    ActionType nvarchar(255) NULL,
    StatementExecuted nvarchar(max) NULL
);
GO
CREATE TRIGGER [DesignLogTrigger] 
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
    /*
        Authored By:                    Max Vernon
        Author Date:                    2012-07-05
        Purpose:                        Capture DDL Statements executed against database
    */
    SET NOCOUNT ON;

    DECLARE @data XML;
    DECLARE @ActionType nvarchar(max);
    DECLARE @Statement nvarchar(max);
    DECLARE @msg nvarchar(max);
    SET @data = EVENTDATA();
    SET @msg = cast(@data.query('(/EVENT_INSTANCE/TSQLCommand/CommandText)') as nvarchar(max));
    SET @msg = dbo.xmltostring(@data.query('(/EVENT_INSTANCE/TSQLCommand/CommandText)'));
    SET @msg = dbo.RemoveTag(@msg, '');
    SET @msg = dbo.RemoveTag(@msg, '');
    SET @ActionType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(255)');
    SET @Statement = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'); 
    IF @msg NOT LIKE 'UPDATE STATISTICS' + char(37) + '' 
        AND @msg NOT LIKE 'ALTER INDEX' + char(37) + 'REORGANIZE' + char(37) + '' 
        AND @msg NOT LIKE 'ALTER INDEX' + char(37) + 'REBUILD' + char(37) + ''
    BEGIN
        BEGIN TRAN;
        INSERT INTO DesignLog 
            (
             ActionType
            , StatementExecuted
            ) 
        VALUES 
            (
             @ActionType
            , @Statement 
            );
        COMMIT TRAN;
    END
END;
GO
ENABLE TRIGGER [DesignLogTrigger] ON DATABASE;
Run Code Online (Sandbox Code Playgroud)

这个特定的 DDL 触发器不会记录某些事件,例如UPDATE STATISTICS, INDEX REBUILD, AND INDEX REORGANIZE。我们对记录这些事件不感兴趣,因为这些事件发生在我们每晚的数据库维护任务中,因此排除了开发人员所做的有意义的更改。

此特定触发器的优点在于它捕获事件的实际 SQL 文本,从而创建对数据库中所有对象所做更改的日志。这允许您恢复到任何给定对象的先前版本 - 一种手动修订控制系统。