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

前端之家收集整理的这篇文章主要介绍了sql-server – 如何保留SQL Server存储过程修订的历史记录前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
注意:我不是在询问完整版本控制. @H_502_2@有没有办法自动保存sql Server上的存储过程的历史记录.

@H_502_2@与Google Docs自动保存文档版本历史的方式类似,Wikipedia会自动保留文章版本的历史记录.

@H_502_2@我不希望用户更新存储过程也要维护存储过程的存储库.这是太多的工作,人们不会这样做.

@H_502_2@希望这是我可以在sql Server中打开的东西……

@H_502_2@(并且通过存储过程我的意思是函数,触发器等.基本上所有都在可编程性下.)

@H_502_2@我发布到https://stackoverflow.com/questions/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions首先我怀疑它会得到更多的意见.

解决方法

虽然我完全同意源代码管理是实现这一目标的正确方法,但我也明白,并非所有环境都足够严格,只能单独使用(如果有的话),并且有时需要更改才能直接保留应用程序运行,保存客户端,你有什么. @H_502_2@您可以使用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)
);
@H_502_2@现在在您的数据库中,首先让我们抓住我们称之为“初始控制”的东西 – 当前版本的存储过程:

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;
@H_502_2@现在要捕获后续更改,请向数据库添加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,ObjectName,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]',HOST_NAME(),@ip,PROGRAM_NAME(),SUSER_SNAME();
END
GO
@H_502_2@随着时间的推移,将很容易看到和比较程序的变化,观察新的程序被添加到系统,看到程序被删除,并很好地了解谁与任何这些事件谈话.

@H_502_2@更多信息:

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

猜你在找的MsSQL相关文章