您如何找到上次访问数据库的时间?

时间:2009-04-02 20:08:10

标签: sql-server sql-server-2005

在SQL Server 2005中,您可以轻松确定某人查询数据库的最后一次。

9 个答案:

答案 0 :(得分:21)

SELECT
last_user_seek = MAX(last_user_seek),
last_user_scan = MAX(last_user_scan),
last_user_lookup = MAX(last_user_lookup),
last_user_update = MAX(last_user_update)
FROM
sys.dm_db_index_usage_stats
WHERE
[database_id] = DB_ID()

使用此方法的一个警告是,每当您重新启动SQL Server时,DMV中的信息都将被清除并清空。

答案 1 :(得分:11)

扩展James Allen的答案:

SELECT d.name,
last_user_seek = MAX(last_user_seek),
last_user_scan = MAX(last_user_scan),
last_user_lookup = MAX(last_user_lookup),
last_user_update = MAX(last_user_update)
FROM sys.dm_db_index_usage_stats AS i
JOIN sys.databases AS d ON i.database_id=d.database_id
GROUP BY d.name

如果您不想要每个数据库上下文的结果并希望在结果集的开头包含数据库名称,请使用此修改后的版本。

答案 2 :(得分:6)

MySQLtips找到了这个 - 为我工作。

select d.name, x1 =
(select X1= max(bb.xx) 
from (
    select xx = max(last_user_seek) 
        where max(last_user_seek) is not null 
    union all 
    select xx = max(last_user_scan) 
        where max(last_user_scan) is not null 
    union all 
    select xx = max(last_user_lookup) 
        where max(last_user_lookup) is not null 
    union all 
        select xx = max(last_user_update) 
        where max(last_user_update) is not null) bb) 
FROM master.dbo.sysdatabases d 
left outer join 
sys.dm_db_index_usage_stats s 
on d.dbid= s.database_id 
group by d.name

答案 3 :(得分:2)

就像今天被问到的这个问题一样,只是碰到了这个帖子……好吧,有人问过在有很多实例的情况下未使用哪些数据库。 因此,我将上述查询从Andrey Shvidky更改为写入临时表,然后选择结果,将找到的最后使用的最大日期与sys.databases中剩余的所有数据库进行比较……从理论上讲, (和假设),它们都具有NULL的最后使用日期,因此没有显示在主查询的结果中,因此是进一步研究删除的候选对象。

SELECT UNPVT.[DataBase], 
       MaxLastUse = MAX(UNPVT.MaxLastUse)
    INTO #tempdatabases
   FROM
    (
       SELECT [DataBase], 
           last_user_seek, 
           last_user_scan, 
           last_user_lookup, 
           last_user_update
      FROM
    (
        SELECT [DataBase] = DB.[name], 
               last_user_seek = MAX(IU.last_user_seek), 
               last_user_scan = MAX(IU.last_user_scan), 
               last_user_lookup = MAX(IU.last_user_lookup), 
               last_user_update = MAX(IU.last_user_update)
        FROM sys.databases AS DB
             INNER JOIN sys.dm_db_index_usage_stats AS IU ON IU.database_id = DB.database_id
        GROUP BY DB.[name]
    ) AS DBIU
) AS P UNPIVOT(MaxLastUse FOR ColumnName IN(last_user_seek, 
                                            last_user_scan, 
                                            last_user_lookup, 
                                            last_user_update)) AS UNPVT
GROUP BY UNPVT.[DataBase]
HAVING MAX(UNPVT.MaxLastUse) IS NOT NULL
ORDER BY MAX(UNPVT.MaxLastUse) ASC;
SELECT name, 
       create_date AS 'Created on', 
       'Not used since last instance start', 
(
    SELECT create_date
    FROM sys.databases
    WHERE database_id = 2
) AS 'Instance start date'
FROM sys.databases
WHERE database_id NOT IN(1, 2, 3, 4)
AND name NOT IN
(
    SELECT [DataBase]
    FROM #tempdatabases
);
DROP TABLE #tempdatabases;

答案 4 :(得分:1)

您需要提前设置审核或sql server跟踪。

答案 5 :(得分:1)

与上述方法类似,但要将结果简单地作为特定数据库ID的单个值(在此示例中为6

select max(LastAccess)
from (
    SELECT last_user_seek as LastAccess FROM sys.dm_db_index_usage_stats WHERE last_user_seek is not null and [database_id]=6
    union
    SELECT last_user_lookup as LastAccess FROM sys.dm_db_index_usage_stats WHERE last_user_seek is not null and [database_id]=6
    union
    SELECT last_user_seek as LastAccess FROM sys.dm_db_index_usage_stats WHERE last_user_seek is not null and [database_id]=6
    union
    SELECT last_user_update as LastAccess FROM sys.dm_db_index_usage_stats WHERE last_user_seek is not null and [database_id]=6
) UserAccess

答案 6 :(得分:0)

不容易,但如果打开SQL Server的日志记录功能,则可以使用软件检查日志,以发现上次查询的时间和内容。

- 亚当

答案 7 :(得分:0)

SQL Server可以记录登录尝试的事件信息,您可以查看它 通过查看错误日志。通过打开 SQL Server的审计级别。

按照以下步骤启用所有/成功连接的审核 SQL Server中的企业管理器:

展开服务器组。 右键单击服务器,然后单击“属性”。 在“安全”选项卡上的“审核级别”下,单击“全部/成功”等(必需 选项)。

您必须停止并重新启动服务器才能使此设置生效

答案 8 :(得分:0)

与上面相同,没有任何枢轴


select
    UNPVT.[DataBase]
    ,MaxLastUse     = max(UNPVT.MaxLastUse)
from
   (
    select
        [DataBase], last_user_seek, last_user_scan, last_user_lookup, last_user_update
    from
        (
            select
                [DataBase]          = DB.[name]
                ,last_user_seek     = max(IU.last_user_seek)
                ,last_user_scan     = max(IU.last_user_scan)
                ,last_user_lookup   = max(IU.last_user_lookup)
                ,last_user_update   = max(IU.last_user_update)
            from
                sys.databases as DB
                inner join sys.dm_db_index_usage_stats as IU on
                    IU.database_id = DB.database_id
            group by
                DB.[name]
        ) as DBIU
    ) as P unpivot (MaxLastUse for ColumnName in (last_user_seek, last_user_scan, last_user_lookup, last_user_update)) as UNPVT
group by
    UNPVT.[DataBase]
order by
    UNPVT.[DataBase]