9

我有 sql server 2008 数据库,我想知道上周更新了哪些表,即哪些表有新行、更新了现有行或删除了哪些行。

有没有办法对现有数据库执行此操作。

4

5 回答 5

12

试试这个——

SELECT 
      [db_name] = d.name
    , [table_name] = SCHEMA_NAME(o.[schema_id]) + '.' + o.name
    , s.last_user_update
FROM sys.dm_db_index_usage_stats s
JOIN sys.databases d ON s.database_id = d.database_id
JOIN sys.objects o ON s.[object_id] = o.[object_id]
WHERE o.[type] = 'U'
    AND s.last_user_update IS NOT NULL
    AND s.last_user_update BETWEEN DATEADD(wk, -1, GETDATE()) AND GETDATE()
于 2013-05-17T07:59:36.953 回答
3

尝试更改数据捕获。这是跟踪数据库更改的好方法。您必须在一个或多个数据库上启用该功能,然后在一个或多个表上启用该功能(这是一个表功能,因此您将为您需要的每个表执行此操作)。


在数据库上启用 CDC。

假设我们要为 AdventureWorks 数据库启用 CDC。我们必须运行以下 SP 以确保此功能正常工作:

USE AdventureWorks 
GO 
EXEC sys.sp_cdc_enable_db 
GO

结果,我们将找到一个名为cdc的新模式,并自动添加了几个表:

  • cdc.captured_columns – 此表返回捕获列列表的结果。
  • cdc.change_tables – 此表返回所有已启用捕获的表的列表。
  • cdc.ddl_history – 此表包含自启用捕获数据以来所有 DDL 更改的历史记录。
  • cdc.index_columns – 此表包含与更改表关联的索引。
  • cdc.lsn_time_mapping – 此表映射 LSN 编号和时间。

在表上启用 CDC。

在所需数据库上启用 CDC 后,是时候检查是否有具有此功能的表:

USE AdventureWorks 
GO 
SELECT [name], is_tracked_by_cdc  
FROM sys.tables 
GO

如果没有,我们可以使用以下过程为 HumanResources.Shift 表启用更改捕获:

USE AdventureWorks 
GO 
EXEC sys.sp_cdc_enable_table 
@source_schema = N'HumanResources', 
@source_name   = N'Shift', 
@role_name     = NULL 
GO

确保您的SQL 代理已启动并正在运行,因为它将创建一个作业(可能是 cdc.AdventureWorks_capture)来捕获修改。如果所有过程都正确执行,我们将在系统表中找到一个名为 cdc.HumanResources_Shift_CT 的新表,其中包含所有 HumanResources.Shift 更改。

注意:注意@role_name 参数,它指定数据库信息访问。

于 2013-05-17T07:30:29.393 回答
2

除非您已经安装了一些审核系统,否则默认情况下无法找到此信息。

假设您的数据库处于完全恢复模式,唯一的选择是读取事务日志并尝试从那里获取信息。

您可以尝试使用 sql server 函数 DBCC LOG 和 fn_dblog 或使用ApexSQL Log等第三方工具读取事务日志。

于 2013-05-17T07:32:54.293 回答
2

正如其他人评论的那样,如果您实施了变更数据捕获和变更跟踪,它们将是理想的解决方案。如果您还没有,那么这里有一个快速的方法,它将为您提供部分信息:

SELECT OBJECT_NAME(OBJECT_ID) AS Object, last_user_update
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( <YourDBName>)
AND OBJECT_ID=OBJECT_ID(<YourTableName>)

这将告诉您什么时候更新了哪些表,但如果您遇到了一个whodunnit 场景,它可能无法真正满足您的目的。此外,它只会为您提供最新更新的时间戳,这意味着,如果有人上周更新而其他人昨天更新,您将看不到上周更新的详细信息。

拉吉

于 2013-05-17T07:37:04.257 回答
0

试试这个。它将提供数据库中每个表的最后更新日期。

USE database_name

GO


SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats

GO

更多参考请点击这里

于 2013-05-17T07:34:37.840 回答