Sql-Server

誰更改/修改了 SSMS 2005 或 2008 中的儲存過程?

  • November 30, 2015

可能重複:

確定架構更改是如何發生的?

我有一個昨晚深夜修改過的儲存過程,早上的大部分時間都在跟踪這個變化。

基本上沒有人承認這一變化,所以我試圖弄清楚如何找到誰修改了這個儲存過程。我已經在網上研究瞭如何找到這個,但看起來這是不可能的?

我想如果有人知道如何做到這一點,那就是這裡的某個人。

我確實試過這個。:

“在 SSMS 中,右鍵點擊伺服器名稱,選擇報告/標準報告/架構更改歷史記錄。” –> 這並沒有給我任何東西,但我至少能夠執行它,這為我提供了時間。

select name, create_date, modify_date
from sys.procedures
where name = 'mystoredprocedure'

感謝您的任何建議或指導。

我知道這並不能解決您目前的問題,但是主動管理此類事件的最佳方法可能是創建一個 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;

此特定 DDL 觸發器不會記錄某些事件,例如UPDATE STATISTICSINDEX REBUILD、 AND INDEX REORGANIZE。我們對記錄這些事件不感興趣,因為這些事件發生在我們每晚的數據庫維護任務中,因此會排擠開發人員所做的有意義的更改。

此特定觸發器的優點是它擷取事件的實際 SQL 文本,從而創建對數據庫中所有對象所做更改的日誌。這允許您恢復到任何給定對象的先前版本 - 一種手動修訂控制系統。

引用自:https://dba.stackexchange.com/questions/25049