如何保留SQL Server存储过程修订的历史记录


22

注意:我并不是在问完整的版本控制。

有没有办法自动保留SQL Server上存储过程的历史记录。

与Google文档自动保留文档版本历史记录以及维基百科自动保留文章版本历史记录相似。

我不希望更新存储过程的用户也必须维护存储过程的存储库。这是太多的工作,人们不会做。

希望这是我可以在SQL Server中启用的功能...

(实际上,存储过程是指函数,触发器等。基本上,所有内容都在“可编程性”下。)

我首先发布到/programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions,因为我怀疑它将在那里获得更多的意见。


评论不作进一步讨论;此对话已转移至聊天
Paul White说GoFundMonica

Answers:


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最简单的本地方法。我的猜测是这是OP所寻找的答案。
Thomas Stringer 2013年

是的,这将是OP问题的解决方案。
玛丽安2013年

我喜欢这个答案,因为一旦您执行此操作,便会获得自动版本控制,而无需任何额外费用。我同意它与源代码管理不同,但这是一个不容忽视的宝贵安全网。
Daniel Williams

2

我认为没有任何方法可以自动将SQL源代码保持在版本控制之下。我的意思是使用本机SQL Server工具。我认为您最终可能会使用git或svn,但是对我来说最好的解决方案是购买Red Gate的Source Control,以将数据库(和存储过程)保持在版本控制之下。


1
当然,DDL触发器无需第三方工具即可完成此操作(请参阅我的回答)。当然,源代码控制提供了更大的控制和审计功能,并且第三方工具将具有比您自己想写的功能更多的功能,但是它们无法保护您免受直接更改的影响-换句话说,它们依赖于每个遵循源代码控制协议的人(这并不总是可行的)。
亚伦·伯特兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.