2010-04-06 7 views
2

SQL Server는 열 추가, 삭제, 이름 바꾸기, 유형/길이 변경 등과 같은 테이블 변경 내용을 추적하는 기록을 유지합니까? 이 작업을 수동으로 수행하기 위해 저장 프로 시저를 사용하는 것이 좋습니다. 그러나 SQL Server가 이러한 시스템 기록을 모든 시스템 테이블에 보관한다면 궁금합니다. 감사.SQL Server 2005 테이블 변경 내역

답변

1

이러한 종류의 정보는 필수 스토리지 요구 사항을 엄청나게 늘릴 수 있고 성능을 심각하게 저하시킬 수 있으므로 기본적으로 RDBMS에 보관되지 않습니다.

트리거가이를 수행 할 수 있습니다. 트리거는 수동 방법으로 간주되지 않으며 데이터베이스 설계의 핵심 부분입니다.

2

트랜잭션 로그에는이 모든 정보가 저장되며 DBCC LOG 명령을 사용하면이를 볼 수 있지만 문서화되지 않은 명령입니다.

DBCC LOG(<database name>[,{0|1|2|3|4}]) 
0 – Basic Log Information (default) 
1 – Lengthy Info 
2 – Very Length Info 
3 – Detailed 
4 – Full Example 

구문 : SQL Server 2005에서

DBCC log (MY_DB, 4) 
3

최대 당신은 테이블 변경 사항을 추적 할 수있는 데이터베이스 레벨 트리거를 만들 수 있습니다. 로그를 확장 할 수

select * from YourLogTable 
EventID  EventDateTime   EventDescription 
----------- ----------------------- --------------------------------------------------------------------------------------------------------------------------------------------------- 
1   2010-04-06 08:25:47.333 sa; TABLE; YourLogTable2; create table YourLogTable2 (EventID int primary key identity(1,1),EventDateTime datetime, EventDescription varchar(max)) 
2   2010-04-06 08:25:55.113 sa; TABLE; YourLogTable2; drop table YourLogTable2 

(2 row(s) affected) 

더 열을 포함, 아니면 그냥이 간단한 예제에서처럼 하나에 모든 것을 덤프 : 여기 로그에서 몇 가지 간단한 출력은

CREATE TRIGGER [YourDatabaseTrigger] 
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS 

DECLARE @EventData  xml 
DECLARE @Message  varchar(1000) 
SET @EventData=EVENTDATA() 

INSERT INTO YourLogTable 
    (EventDateTime,EventDescription) 
    VALUES (GETDATE(),SUSER_NAME() 
        +'; '[email protected]('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(250)') 
        +'; '[email protected]('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(250)') 
        +'; '[email protected]('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') 
      ) 
RETURN 
GO 

ENABLE TRIGGER [YourDatabaseTrigger] ON DATABASE 

: 같은 것을 사용합니다.

+0

감사합니다. KM. 그러나 나는 이미 잘 작동하는 ddl 트리거를 시도했는데 새로운 컬럼 만 테이블에 추가되면 로그 정보를 쉽게 사용할 수 있습니다. 하지만 로그에 TSQL 명령을 사용하여 외래 키 참조가있는 열의 이름을 바꾸거나 varchar 형식 열의 길이를 변경하는 것과 같은 지루한 작업이라고 생각합니다. 저장소는 곧 Unreason으로 '문제'가됩니다. 고 밝혔다. – Kayes