SQL Server是否维护任何历史记录来跟踪表格更改,例如列添加,删除,重命名,类型/长度更改等?我发现许多建议使用存储过程手动执行此操作。但我很好奇SQL Server是否在任何系统表中保留了这样的历史记录?感谢。
答案 0 :(得分: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()
+'; '+@EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(250)')
+'; '+@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(250)')
+'; '+@EventData.value('(/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)
你可以扩展日志以包含更多列,或者只是将所有内容转储到一个列中,就像在这个简单的例子中一样。
答案 1 :(得分: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)
答案 2 :(得分:1)
默认情况下,此类信息不会保留在任何RDBMS中,因为它可能会使所需的存储要求增加数量级,并可能严重降低性能。
触发器可以为您完成此操作。触发器不被视为手动方法 - 它们是数据库设计的核心部分。