如何列出上周删除或更新数据的表格

时间:2013-05-17 07:02:34

标签: sql sql-server

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

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

5 个答案:

答案 0 :(得分:10)

试试这个 -

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()

答案 1 :(得分:3)

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


在数据库上启用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 Agent 已启动并正在运行,因为它将创建一个作业(可能是cdc.AdventureWorks_capture)以捕获修改。 如果所有过程都正确执行,我们将在系统表中找到一个名为cdc.HumanResources_Shift_CT的新表,其中包含所有HumanResources.Shift更改。

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

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场景,可能无法真正满足您的目的。此外,它只会为您提供最新更新的时间戳,这意味着,如果有人在上周更新并且其他人昨天更新了,您将看不到上周更新的详细信息。

拉​​吉

答案 4 :(得分:0)

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

USE database_name

GO


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

GO

如需更多参考,请点击here