web-dev-qa-db-fra.com

Qui a changé / modifié la procédure stockée dans SSMS 2005 ou 2008?

Dupliquer possible:
[.____] Déterminer comment un changement de schéma s'est produit?

J'ai une procédure stockée qui a été modifiée tard la nuit dernière et je viens de passer la majorité des problèmes de traçage du matin à ce changement.

Fondamentalement, personne ne possède à ce changement, j'essaie donc de déterminer comment trouver qui a modifié cette procédure stockée. J'ai étudié sur le Web pour voir comment le trouver, mais il semble que cela ne soit pas possible?

J'ai pensé si quelqu'un sait comment faire cela, ce serait une personne ici.

J'ai essayé ceci. :

"Dans SSMS, cliquez avec le bouton droit de la souris sur le nom du serveur, choisissez Rapports/rapports standard/Schéma change d'historique." -> Ce qui ne m'a rien donné mais j'ai été au moins capable de courir ceci qui m'a fourni un temps.

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

Merci pour un conseil ou une direction.

5
User Smith

Je sais que cela ne résout pas votre problème immédiat, mais la meilleure façon de gérer pro-activement ce type d'événement d'évoluer peut être de créer un déclencheur de base de données DDL qui enregistre des événements dans une table de journaux de conception tels que:

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;

Ce déclencheur de DDL particulier ne connecte pas certains événements tels que UPDATE STATISTICS, INDEX REBUILD, ET INDEX REORGANIZE. Nous ne sommes pas intéressés à l'exploitation de ces événements depuis que ces événements se produisent lors de nos tâches de maintenance de la base de données nocturnes, et ont donc une foule des modifications significatives apportées par les développeurs.

L'avantage de ce déclencheur particulier est qu'il capture le texte SQL réel de l'événement, créant ainsi un journal des modifications apportées à tous les objets de la base de données. Cela vous permet de revenir à une version antérieure d'un objet donné - une sorte de système de contrôle de révision manuelle.

8
Max Vernon