So speichern Sie den Verlauf von SQL Server-Versionen gespeicherter Prozeduren

22

Hinweis: Ich frage nicht nach der Vollversion.

Gibt es eine Möglichkeit, automatisch einen Verlauf von gespeicherten Prozeduren auf SQL Server zu speichern?

Ähnlich wie Google Text & Tabellen automatisch einen Verlauf von Versionen von Dokumenten und Wikipedia automatisch einen Verlauf von Versionen von Artikeln führt.

Ich möchte nicht, dass Benutzer, die gespeicherte Prozeduren aktualisieren, auch ein Repository mit gespeicherten Prozeduren verwalten müssen. Das ist zu viel Arbeit und die Leute werden es nicht tun.

Hoffentlich kann ich das in SQL Server aktivieren ...

(Und mit Stored Procedures meine ich eigentlich Funktionen, Trigger usw. Grundsätzlich alles unter Programmierbarkeit.)

Ich habe auf /programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions gepostet, da ich vermute, dass es dort mehr Aufrufe geben würde.

cja
quelle
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Paul White sagt GoFundMonica

Antworten:

31

Obwohl ich völlig einverstanden bin, dass die Quellcodeverwaltung der richtige Weg ist, verstehe ich auch, dass nicht alle Umgebungen diszipliniert genug sind, um sich (wenn überhaupt) darauf zu verlassen, und dass manchmal Änderungen direkt vorgenommen werden müssen, um die App zu behalten Laufen, speichern Sie einen Client, was haben Sie.

Sie können einen DDL-Trigger verwenden, um alle Revisionen in einer Tabelle in einer separaten Datenbank zu speichern (und diese Datenbank natürlich häufig zu sichern). Angenommen, Sie haben eine Dienstprogrammdatenbank:

USE Utility;
GO


CREATE TABLE dbo.ProcedureChanges
(
    EventDate    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    EventType    NVARCHAR(100),
    EventDDL     NVARCHAR(MAX),
    DatabaseName NVARCHAR(255),
    SchemaName   NVARCHAR(255),
    ObjectName   NVARCHAR(255),
    HostName     NVARCHAR(255),
    IPAddress    VARCHAR(32),
    ProgramName  NVARCHAR(255),
    LoginName    NVARCHAR(255)
);

Lassen Sie uns nun in Ihrer Datenbank zunächst die so genannte "Initial Control" - die aktuelle Version der gespeicherten Prozeduren - abrufen:

USE YourDB;
GO

INSERT Utility.dbo.ProcedureChanges
(
    EventType,
    EventDDL,
    DatabaseName,
    SchemaName,
    ObjectName
)
SELECT
    N'Initial control',
    OBJECT_DEFINITION([object_id]),
    DB_NAME(),
    OBJECT_SCHEMA_NAME([object_id]),
    OBJECT_NAME([object_id])
FROM
    sys.procedures;

Fügen Sie der Datenbank jetzt einen DDL-Trigger hinzu, um nachfolgende Änderungen zu erfassen:

USE YourDB;
GO

CREATE TRIGGER CaptureStoredProcedureChanges
    ON DATABASE
    FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @EventData XML = EVENTDATA(), @ip VARCHAR(32);

    SELECT @ip = client_net_address
        FROM sys.dm_exec_connections
        WHERE session_id = @@SPID;

    INSERT Utility.dbo.ProcedureChanges
    (
        EventType,
        EventDDL,
        SchemaName,
        ObjectName,
        DatabaseName,
        HostName,
        IPAddress,
        ProgramName,
        LoginName
    )
    SELECT
        @EventData.value('(/EVENT_INSTANCE/EventType)[1]',   'NVARCHAR(100)'), 
        @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
        @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',  'NVARCHAR(255)'), 
        @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',  'NVARCHAR(255)'),
        DB_NAME(), HOST_NAME(), @ip, PROGRAM_NAME(), SUSER_SNAME();
END
GO

Mit der Zeit wird es einfach, Änderungen an Prozeduren zu sehen und zu vergleichen, zu beobachten, wie neue Prozeduren zum System hinzugefügt werden, wie Prozeduren gelöscht werden, und eine gute Vorstellung davon zu haben, mit wem man über eines dieser Ereignisse sprechen kann.

Weitere Informationen hier:

http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/

Aaron Bertrand
quelle
2
+1 Die einfachste und native Methode, dies zu tun. Ich vermute, das ist die Antwort, nach der das OP gesucht hat.
Thomas Stringer
Ja, dies wird die Lösung für das OP-Problem sein.
Marian
Ich liebe diese Antwort, denn sobald Sie dies tun, erhalten Sie eine automatische Versionierung ohne zusätzliche Kosten. Ich bin damit einverstanden, dass es nicht dasselbe ist wie die Quellcodeverwaltung, aber es ist ein wertvolles Sicherheitsnetz, das nicht ignoriert werden sollte.
Daniel Williams
2

Ich glaube nicht, dass es eine Möglichkeit gibt, Ihren SQL-Quellcode automatisch unter Versionskontrolle zu halten. Ich meine mit Native SQL Server-Tools. Ich denke, Sie könnten am Ende git oder svn verwenden, aber die beste Lösung für mich war es, die Quellcodeverwaltung von Red Gate zu kaufen , um Datenbanken (und gespeicherte Prozeduren) unter Versionskontrolle zu halten.

jrara
quelle
1
Sicher, ein DDL-Trigger kann dies tun, ohne Tools von Drittanbietern zu benötigen (siehe meine Antwort). Natürlich bietet die Quellcodeverwaltung eine viel bessere Kontrolle und Überwachung, und Tools von Drittanbietern verfügen über viel mehr Funktionen, als Sie selbst schreiben möchten. Sie können Sie jedoch nicht vor direkten Änderungen schützen - mit anderen Worten, sie sind darauf angewiesen bei jedem, der das Versionskontrollprotokoll befolgt (was nicht immer möglich ist).
Aaron Bertrand