我有一个拥有100多个表的数据库。我会持续地向已有的表中添加列(如果需要的话),也会添加一些新表。
现在,我想要检查我在过去三个月里做了哪些更改。MS SQL Server 2012 中是否有针对该特定数据库的活动日志来跟踪更改。
我有一个拥有100多个表的数据库。我会持续地向已有的表中添加列(如果需要的话),也会添加一些新表。
现在,我想要检查我在过去三个月里做了哪些更改。MS SQL Server 2012 中是否有针对该特定数据库的活动日志来跟踪更改。
sys.objects
有创建和修改日期,但不幸的是,sys.columns
没有。然而,最新添加的列将具有更高的列 ID。我不知道您是否能够轻松地挑选出已删除的列。请注意,除列更改外的其他更改可能会反映在修改日期中。select s.name [schema], o.name [table], o.modify_date [table_modify_date], c.column_id, c.name
from sys.schemas s
join sys.objects o on o.schema_id = s.schema_id
left join sys.columns c on c.object_id = o.object_id
where o.type = 'U' --user tables only
and o.modify_date >= dateadd(M,-3, getdate())
order by s.name, o.name, column_id;
目前,您的选择有限,今后您可以尝试以下操作,并检查它们是否有帮助..
1.如果您已启用审计,则可以跟踪更改。
要检查是否启用了审计,请使用下面的查询。
select * from sys.dm_server_audit_status
select * from fn_dblog(null,null) where [transaction name]='CREATE TABLE'
上述的Tlog选项仅适用于您拥有超过三个月的Tlog备份并且您需要进行恢复的情况。
如果您想查看过去的所有活动,可以使用MSSQL审计。这是跟踪任何时间的更改的最佳方式。请查看https://msdn.microsoft.com/en-us/library/cc280386.aspx
CREATE TRIGGER ColumnChanges
ON DATABASE
FOR ALTER_TABLE
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT alter_table_log
(PostTime, DB_User, Event, TSQL)
VALUES
(GETDATE(),
CONVERT(nvarchar(100), CURRENT_USER),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
GO
这个查询会给出存储过程的创建和修改日期:
select name,create_date,modify_date
from sys.procedures
order by modify_date desc