如何在Sql Server 2005上获取最后一次插入/更新/删除日期时间?

Jad*_*ias 7 t-sql sql-server sql-server-2005

不是我之前的问题的重复

当表/数据库在Sql Server 2005上有插入/更新/删除时,有没有办法获得最新的日期时间?最好不要创建触发器..

我知道当你需要每行最后一次更新时,你需要触发器.但是当你想要获得整个表的最后一次更新时,我不确定是否需要它们.

小智 14

SELECT t.name,
       user_seeks,
       user_scans,
       user_lookups,
       user_updates,
       last_user_seek,
       last_user_scan,
       last_user_lookup,
       last_user_update
FROM   sys.dm_db_index_usage_stats i
       JOIN sys.tables t
         ON ( t.object_id = i.object_id )
WHERE  database_id = DB_ID() 
Run Code Online (Sandbox Code Playgroud)


小智 8

您可以轻松获取上次插入/更新/删除的日期,如下所示:

CREATE FUNCTIOn fn_TablesLastUpdateDate(@Date NVARCHAR(20))

RETURNS @table TABLE(TableName NVARCHAR(40), LastUpdated Datetime)

AS

BEGIN


IF(@Date='') OR (@Date Is Null) OR (@Date='0')

    BEGIN
        INSERT INTO @table
        SELECT TOP 100 PERCENT TABLENAME,LASTUPDATED FROM 
        (
            SELECT  B.NAME AS 'TABLENAME', MAX(STATS_DATE (ID,INDID)) AS LASTUPDATED
            FROM    SYS.SYSINDEXES AS A
                    INNER JOIN SYS.OBJECTS AS B ON A.ID = B.OBJECT_ID
            WHERE   B.TYPE = 'U'  AND STATS_DATE (ID,INDID) IS NOT NULL 
            GROUP BY B.NAME
        ) AS A
        ORDER BY LASTUPDATED DESC
    END
ELSE

    BEGIN
        INSERT INTO @table
        SELECT TOP 100 PERCENT TABLENAME,LASTUPDATED FROM 
        (
            SELECT  B.NAME AS 'TABLENAME', MAX(STATS_DATE (ID,INDID)) AS LASTUPDATED,
                    CONVERT(VARCHAR, MAX(STATS_DATE (ID,INDID)), 103) as Date
            FROM    SYS.SYSINDEXES AS A
                    INNER JOIN SYS.OBJECTS AS B ON A.ID = B.OBJECT_ID
            WHERE   B.TYPE = 'U'  AND STATS_DATE (ID,INDID) IS NOT NULL 
            GROUP BY B.NAME
        ) AS A
        WHERE Date=@Date
        ORDER BY LASTUPDATED DESC
    END
RETURN

END



-- SELECT * from fn_TablesLastUpdateDate('06/11/2012')
Run Code Online (Sandbox Code Playgroud)

  • 这不符合要求。它显示上次更新统计信息的时间。完全可以在不触发统计更新的情况下插入/删除/更新行。相反,即使没有任何更改,也可能有更新统计信息的维护计划。 (3认同)

mar*_*c_s 6

正如之前的两个答案所示,SQL Server中确实没有内置功能可以满足您的要求.

有大量的动态管理视图可以告诉您一些您感兴趣的点,例如sys.dm_db_index_usage_stats,它告诉您何时某个索引有最后的搜索或更新.

但是你真的没有任何东西可以用来获取你正在寻找的所有信息 - 你真的必须自己这样做,在你的表中添加例如datetime字段并用触发器填充它们.

对不起,我不能给你任何更好的消息 - 这就是现在的方式.

在SQL Server 2008中,您有其他新功能,可能会满足您的一些要求 - 请查看: