Как сохранить историю изменений хранимых процедур SQL Server

22

Примечание: я не спрашиваю о полном контроле версий.

Есть ли способ автоматически вести историю хранимых процедур на SQL Server.

Аналогично тому, как Google Docs автоматически ведет историю версий документов, а Wikipedia автоматически ведет историю версий статей.

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

Надеюсь, это то, что я могу включить в SQL Server ...

(И под хранимыми процедурами на самом деле я имею в виду функции, триггеры и т. Д. В основном все под программируемостью.)

Сначала я разместил на /programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions, потому что я подозреваю, что там будет больше просмотров.

ЦСП
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Пол Уайт говорит, что 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 Самый простой и родной способ сделать это. Я предполагаю, что это ответ, который искал ОП.
Томас Стрингер
Да, это будет решение проблемы ОП.
Мариан
Мне нравится этот ответ, потому что, как только вы это сделаете, вы получите автоматическое управление версиями без дополнительных затрат. Я согласен, что это не то же самое, что Source Control, но это ценная сеть безопасности, которую нельзя игнорировать.
Даниэль Уильямс
2

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

jrara
источник
1
Конечно, триггер DDL может сделать это без использования сторонних инструментов (см. Мой ответ). Конечно, контроль исходного кода предлагает гораздо больший контроль и аудит, а сторонние инструменты будут иметь гораздо больше возможностей, чем вы захотите написать сами, но у них нет способа защитить вас от прямых изменений - другими словами, они полагаются на всех, кто подчиняется протоколу контроля версий (что не всегда возможно).
Аарон Бертран