我有sql server 2008数据库,我想知道上周更新了哪些表,即具有新行,更新现有行或删除哪些行的表。
有没有办法对现有数据库执行此操作。
答案 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。
在所需的数据库上启用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