ในขณะที่ฉันเห็นด้วยอย่างเต็มที่ว่าการควบคุมแหล่งที่มาเป็นวิธีที่ถูกต้องในการทำสิ่งนี้ฉันยังเข้าใจด้วยว่าสภาพแวดล้อมบางอย่างนั้นไม่ได้รับการลงโทษทางวินัยมากพอที่จะไว้ใจคนเดียว (ถ้าทั้งหมด) และบางครั้งการเปลี่ยนแปลง วิ่งบันทึกลูกค้าคุณมีอะไรบ้าง
คุณสามารถใช้ทริกเกอร์ 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,
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
เมื่อเวลาผ่านไปมันจะกลายเป็นเรื่องง่ายที่จะเห็นและเปรียบเทียบการเปลี่ยนแปลงกับโพรซีเดอร์ดูโพรซีเดอร์ใหม่ที่ถูกเพิ่มเข้ากับระบบดูโพรซีเดอร์ตกหล่นและมีความคิดที่ดีว่าจะพูดคุยกับใครเกี่ยวกับเหตุการณ์เหล่านี้
ข้อมูลเพิ่มเติมที่นี่:
http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/