加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-05-24 05:47:12 所属栏目:MsSql教程 来源:网络整理
导读:注意:我不是在询问完整版本控制. 有没有办法自动保存SQL Server上的存储过程的历史记录. 与Google Docs自动保存文档版本历史的方式类似,Wikipedia会自动保留文章版本的历史记录. 我不希望用户更新存储过程也要维护存储过程的存储库.这是太多的工作,人们不

注意:我不是在询问完整版本控制.

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

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

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

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

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

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

解决方法

虽然我完全同意源代码管理是实现这一目标的正确方法,但我也明白,并非所有环境都足够严格,只能单独使用(如果有的话),并且有时需要更改才能直接保留应用程序运行,保存客户端,你有什么.

您可以使用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,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

随着时间的推移,将很容易看到和比较程序的变化,观察新的程序被添加到系统,看到程序被删除,并很好地了解谁与任何这些事件谈话.

更多信息:

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

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读