Jak zachować historię wersji procedur przechowywanych programu SQL Server

22

Uwaga: nie pytam o pełną kontrolę wersji.

Czy istnieje jakiś sposób automatycznego przechowywania historii procedur przechowywanych na serwerze SQL Server.

Podobne do tego, jak Dokumenty Google automatycznie przechowują historię wersji dokumentów, a Wikipedia automatycznie przechowuje historię wersji artykułów.

Nie chcę, aby użytkownicy aktualizujący procedury przechowywane musieli także utrzymywać repozytorium procedur przechowywanych. To za dużo pracy i ludzie tego nie zrobią.

Mam nadzieję, że mogę to włączyć w programie SQL Server ...

(A przez procedury składowane naprawdę mam na myśli funkcje, wyzwalacze itp. Zasadniczo wszystko w ramach Programowalności.)

Opublikowałem na /programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions pierwszy, ponieważ podejrzewam, że uzyska tam więcej wyświetleń.

cja
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Paul White mówi GoFundMonica

Odpowiedzi:

31

Chociaż zgadzam się, że kontrola źródła jest właściwym sposobem, aby to zrobić, rozumiem również, że nie wszystkie środowiska są wystarczająco zdyscyplinowane, aby polegać na tym samym (jeśli w ogóle), i że czasami trzeba wprowadzić bezpośrednie zmiany, aby zachować aplikację uruchom, uratuj klienta, co masz.

Za pomocą wyzwalacza DDL można przechowywać wszystkie wersje w tabeli w osobnej bazie danych (i oczywiście często wykonywać kopię zapasową tej bazy danych). Zakładając, że masz bazę danych narzędzi:

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)
);

Teraz w twojej bazie danych, najpierw weźmy coś, co nazwiemy „kontrolą początkową” - bieżąca wersja procedur przechowywanych:

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;

Teraz, aby przechwycić kolejne zmiany, dodaj wyzwalacz DDL do bazy danych:

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

Z czasem łatwiej będzie zobaczyć i porównać zmiany w procedurach, zobaczyć, jak nowe procedury są dodawane do systemu, zobaczyć, jak procedury są upuszczane, i mieć dobry pomysł z kim porozmawiać o którymkolwiek z tych zdarzeń.

Więcej informacji tutaj:

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

Aaron Bertrand
źródło
2
+1 Najprostszy i natywny sposób na zrobienie tego. Sądzę, że to jest odpowiedź, której szukał OP.
Thomas Stringer,
Tak, to będzie rozwiązanie problemu OP.
Marian
Podoba mi się ta odpowiedź, ponieważ kiedy to zrobisz, otrzymasz automatyczną wersję bez dodatkowych kosztów. Zgadzam się, że to nie to samo, co kontrola źródła, ale jest to cenna siatka bezpieczeństwa, której nie należy ignorować.
Daniel Williams,
2

Nie sądzę, aby istniał sposób na automatyczne utrzymanie kodu źródłowego SQL pod kontrolą wersji. Mam na myśli narzędzia Native SQL Server. Myślę, że możesz skończyć z użyciem git lub svn, ale najlepszym rozwiązaniem dla mnie było kupienie Kontroli Źródła Red Gate do utrzymywania baz danych (i procedur przechowywanych) pod kontrolą wersji.

jrara
źródło
1
Jasne, wyzwalacz DDL może to zrobić bez użycia narzędzi innych firm (patrz moja odpowiedź). Oczywiście kontrola źródła zapewnia znacznie większą kontrolę i audyt, a narzędzia innych firm będą miały znacznie więcej funkcji, niż będziesz chciał napisać sam, ale nie mają sposobu, aby chronić cię przed bezpośrednimi zmianami - innymi słowy polegają na wszystkich przestrzegających protokołu kontroli źródła (co nie zawsze jest możliwe).
Aaron Bertrand