web-dev-qa-db-ja.com

SSMS 2005または2008でストアドプロシージャを変更または変更したのは誰ですか?

重複の可能性:
スキーマの変更がどのように発生したかを判断しますか?

昨夜遅く変更されたストアドプロシージャがあり、朝の大部分のトレース問題をこの変更に戻しました。

基本的に、この変更まで誰も所有していないので、このストアドプロシージャを変更したユーザーを見つける方法を見つけようとしています。これを見つける方法を確認するためにWebを調査しましたが、これは不可能のように見えますか?

誰かがこれを行う方法を知っているなら、それはここの誰かであろうと考えました。

私はこれを試しました。 :

「SSMSでサーバー名を右クリックし、[レポート]、[標準レポート]、[スキーマ変更履歴]の順に選択します。 " ->これは私に何も与えませんでしたが、少なくとも時間を提供するこれを実行することができました。

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

アドバイスや指示をありがとう。

5
User Smith

これで当面の問題が解決しないことはわかっていますが、このタイプのイベントをプロアクティブに管理する最善の方法は、次のような設計ログテーブルにイベントを記録する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、およびINDEX REORGANIZEなどの特定のイベントをログに記録しません。これらのイベントは夜間のデータベースメンテナンスタスク中に発生するため、これらのイベントをログに記録することには関心がありません。

この特定のトリガーの利点は、イベントの実際のSQLテキストをキャプチャすることです。これにより、データベース内のすべてのオブジェクトに加えられた変更のログが作成されます。これにより、任意のオブジェクトの前のバージョンに戻すことができます-一種の手動リビジョン管理システム。

8
Max Vernon