Kaynak kontrolünün bunu yapmanın doğru yolu olduğu konusunda hemfikir olduğum halde, tüm ortamların tek başına buna dayanacak kadar disipline edilmediğini (eğer varsa) ve bazen de uygulamanın sürdürülmesi için doğrudan yapılması gerekenlerin olduğunu da anlıyorum. Koşturup, bir müşteriyi kurtar.
Bir tablodaki tüm revizyonları ayrı bir veritabanında tutmak için bir DDL tetikleyicisi kullanabilirsiniz (ve tabii ki bu veritabanını sık sık yedekleyin). Bir yardımcı program veritabanınız olduğunu varsayalım:
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)
);
Şimdi veritabanınızda, öncelikle "ilk kontrol" dediğimiz şeyi alalım - saklı yordamların şu anki sürümü:
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;
Şimdi müteakip değişiklikleri yakalamak için veritabanına bir DDL tetikleyicisi ekleyin:
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
Zamanla prosedürlerdeki değişiklikleri görmek ve karşılaştırmak, sisteme yeni prosedürlerin eklenmesini izlemek, prosedürlerin düştüğünü görmek ve bu olayların herhangi biri hakkında kiminle konuşacağına dair iyi bir fikre sahip olmak kolaylaşacaktır.
Daha fazla bilgi burada:
http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/