2010-04-06 150 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 

語法:

DBCC log (MY_DB, 4) 
3

在SQL Server 2005和最多可以創建數據庫級別觸發器來跟蹤表的更改。使用類似:

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 

這裏是從日誌一些輸出簡單:

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) 

你可以擴展日誌包含更多的列,或者只是一個內傾倒一切都像在這個簡單的例子。

+0

謝謝KM。但我已經嘗試ddl觸發器哪些工作正常,如果只有新列被添加到表中,可以很容易地使用日誌信息。但是,我認爲在日誌中使用TSQL命令來進行重新命名是一件很乏味的工作,例如重命名具有外鍵引用的列或更改varchar類型列的長度等。存儲很快會成爲「Unreason」的「問題」說過。 – Kayes 2010-04-07 10:50:43