Mặc dù tôi hoàn toàn đồng ý rằng kiểm soát nguồn là cách phù hợp để thực hiện việc này, tôi cũng hiểu rằng không phải tất cả các môi trường đều đủ kỷ luật để chỉ dựa vào điều đó (nếu có) và đôi khi phải thay đổi trực tiếp để giữ ứng dụng chạy, lưu một khách hàng, những gì có bạn.
Bạn có thể sử dụng trình kích hoạt DDL để giữ tất cả các sửa đổi trong một bảng trong một cơ sở dữ liệu riêng biệt (và tất nhiên là thường xuyên sao lưu cơ sở dữ liệu đó). Giả sử bạn có một cơ sở dữ liệu tiện ích:
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)
);
Bây giờ trong cơ sở dữ liệu của bạn, trước tiên hãy lấy cái mà chúng ta gọi là "kiểm soát ban đầu" - phiên bản hiện tại của các thủ tục được lưu trữ:
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;
Bây giờ để nắm bắt các thay đổi tiếp theo, hãy thêm trình kích hoạt DDL vào cơ sở dữ liệu:
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
Theo thời gian, nó sẽ trở nên dễ dàng để xem và so sánh các thay đổi với quy trình, xem các quy trình mới được thêm vào hệ thống, xem các quy trình bị loại bỏ và có ý tưởng tốt về việc ai sẽ nói chuyện với bất kỳ sự kiện nào trong số này.
Thêm thông tin ở đây:
http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/