Як зберегти історію оновлених процедур, що зберігаються в SQL Server


22

Примітка: я не запитую про повний контроль версій.

Чи є можливість автоматично зберігати історію збережених процедур на SQL Server.

Подібно до того, як Google Docs автоматично зберігає історію версій документів, а Wikipedia автоматично зберігає історію версій статей.

Я не хочу, щоб користувачі, що оновлювали збережені процедури, також мали підтримувати сховище збережених процедур. Це занадто багато роботи, і люди цього не робитимуть.

Сподіваюся, це те, що я можу включити в SQL Server ...

(І під збереженими процедурами я справді маю на увазі функції, тригери і т. Д. В основному все під програмованістю.)

Я опублікував на /programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-reitions, тому що я підозрюю, що там буде більше поглядів.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Пол Білий каже, що GoFundMonica

Відповіді:


31

Хоча я повністю згоден, що контроль над джерелами - це правильний спосіб зробити це, я також розумію, що не всі середовища є достатньо дисциплінованими, щоб покладатися тільки на це (якщо взагалі), і що іноді доводиться робити зміни безпосередньо, щоб зберегти додаток працює, збережіть клієнта, що у вас є.

Ви можете використовувати тригер DDL, щоб зберігати всі зміни в таблиці в окремій базі даних (і, звичайно, часто створювати резервну копію цієї бази даних). Припустимо, що у вас є база даних утиліт:

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

Тепер у вашій базі даних спочатку давайте захопимо те, що ми будемо називати "початковий контроль" - поточну версію збережених процедур:

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;

Тепер, щоб зафіксувати наступні зміни, додайте в базу даних тригер 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

З часом стане легко бачити та порівнювати зміни до процедур, спостерігати за тим, як нові процедури додаватимуться до системи, бачити, як процедури відмовляються, і мати гарне уявлення, з ким поговорити про будь-яку з цих подій.

Більше інформації тут:

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


2
+1 Найпростіший і рідний спосіб зробити це. Я здогадуюсь, це відповідь, яку шукав ОП.
Томас Стрінгер

Так, це буде вирішенням проблеми ОП.
Маріан

Мені подобається ця відповідь, бо коли ви це зробите, то ви отримуєте автоматичну версію без додаткових витрат. Я погоджуюся, що це не те саме, що управління джерелами, але це цінна мережа безпеки, яку не слід ігнорувати.
Даніель Вільямс

2

Я не думаю, що існує спосіб автоматичного утримання вихідного коду SQL під контролем версій. Я маю на увазі інструменти Native SQL Server. Я думаю, ви могли б використовувати git або svn, але найкращим рішенням для мене було придбати джерело Red Gate Source Control для зберігання баз даних (і збережених процедур) під контролем версій.


1
Звичайно, тригер DDL може це зробити, не потребуючи сторонніх інструментів (див. Мою відповідь). Звичайно, джерело управління пропонує набагато більший контроль та аудит, а сторонні інструменти матимуть набагато більше можливостей, ніж ви хочете написати самі, але у них немає способу захистити вас від прямих змін - іншими словами, вони покладаються для всіх, хто підкоряється протоколу управління джерелом (що не завжди можливо).
Аарон Бертран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.