注意:我不是在询问完整版本控制.
有没有办法自动保存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;
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/