소스 제어가 올바른 방법이라고 전적으로 동의하지만 모든 환경이 그 자체에만 의존 할만큼 충분히 훈련되지는 않았으며 앱을 유지하기 위해 직접 변경해야 할 수도 있음을 이해합니다. 실행, 클라이언트를 저장, 당신은 무엇입니까.
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/