it-swarm-eu.dev

Jak udržovat historii revizí uložených procedur serveru SQL Server

Poznámka: Neptám se na úplnou kontrolu verze.

Existuje nějaký způsob, jak automaticky uchovávat historii uložených procedur na serveru SQL.

Podobně jako Google Docs automaticky udržuje historii verzí dokumentů a Wikipedia automaticky udržuje historii verzí článků.

Nechci, aby uživatelé aktualizující uložené procedury měli také udržovat úložiště uložených procedur. To je příliš mnoho práce a lidé to neudělají.

Doufejme, že to je něco, co mohu zapnout v SQL Server ...

(A podle uložených procedur mám na mysli funkce, spouštěče atd. V podstatě všechno v rámci Programovatelnosti.)

Zveřejnil jsem příspěvek https://stackoverflow.com/questions/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions první, protože mám podezření, že získá více zobrazení tam.

22
cja

I když plně souhlasím s tím, že ovládání zdroje je tím správným způsobem, chápu také, že ne všechna prostředí jsou dostatečně disciplinovaná, aby se na to mohla spoléhat sama (pokud vůbec), a že někdy je třeba provést změny přímo, aby aplikace zůstala běh, uložte klienta, co máte.

Spouštěč DDL můžete použít k uchování všech revizí v tabulce v samostatné databázi (a samozřejmě tuto databázi samozřejmě často zálohovat). Předpokládejme, že máte databázi nástrojů:

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

Nyní ve vaší databázi nejprve pojďme chytit to, čemu říkáme „počáteční kontrola“ - aktuální verze uložených procedur:

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;

Nyní, abyste zachytili následné změny, přidejte do databáze spouštěč DDL:

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

Postupem času bude snadné vidět a porovnat změny v postupech, sledovat, jak se do systému přidávají nové postupy, vidět, jak vypadají procedury, a mít dobrou představu o tom, s kým o jakékoli z těchto událostí hovořit.

Více informací zde:

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

31
Aaron Bertrand

Nemyslím si, že existuje nějaký způsob, jak automaticky udržet zdrojový kód SQL pod kontrolou verzí. Mám na mysli nástroje Native SQL Server. Myslím, že byste mohli nakonec použít git nebo svn, ale nejlepší řešení pro mě bylo koupit Red Gate's Source Control za udržování databází (a uložených procedur) pod kontrolou verzí.

2
jrara