Obwohl ich völlig einverstanden bin, dass die Quellcodeverwaltung der richtige Weg ist, verstehe ich auch, dass nicht alle Umgebungen diszipliniert genug sind, um sich (wenn überhaupt) darauf zu verlassen, und dass manchmal Änderungen direkt vorgenommen werden müssen, um die App zu behalten Laufen, speichern Sie einen Client, was haben Sie.
Sie können einen DDL-Trigger verwenden, um alle Revisionen in einer Tabelle in einer separaten Datenbank zu speichern (und diese Datenbank natürlich häufig zu sichern). Angenommen, Sie haben eine Dienstprogrammdatenbank:
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)
);
Lassen Sie uns nun in Ihrer Datenbank zunächst die so genannte "Initial Control" - die aktuelle Version der gespeicherten Prozeduren - abrufen:
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;
Fügen Sie der Datenbank jetzt einen DDL-Trigger hinzu, um nachfolgende Änderungen zu erfassen:
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
Mit der Zeit wird es einfach, Änderungen an Prozeduren zu sehen und zu vergleichen, zu beobachten, wie neue Prozeduren zum System hinzugefügt werden, wie Prozeduren gelöscht werden, und eine gute Vorstellung davon zu haben, mit wem man über eines dieser Ereignisse sprechen kann.
Weitere Informationen hier:
http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/