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