Как сохранить историю изменений хранимых процедур 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 для хранения баз данных (и хранимых процедур) под контролем версий.


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