触发器执行的最后时间

Pra*_*ant 3 trigger sql-server sql-server-2014

SQL SERVER 2014 - 有没有办法知道上次执行触发器的时间?

McN*_*ets 12

如果您的触发器在缓存中,您可以使用:sys.dm_exec_trigger_stats

返回缓存触发器的聚合性能统计信息。视图中每个触发器包含一行,并且该行的生命周期与触发器保持缓存的时间一样长。当从缓存中删除触发器时,相应的行将从该视图中删除。

选择 d.object_id, 
         d.database_id, 
         DB_NAME(database_id) AS 'database_name',   
         OBJECT_NAME(object_id, database_id) AS 'trigger_name', 
         d.cached_time,  
         d.last_execution_time, 
         d.total_elapsed_time,   
         d.total_elapsed_time/d.execution_count AS [avg_elapsed_time],   
         d.last_elapsed_time, 
         d.execution_count  
FROM sys.dm_exec_trigger_stats AS d  
ORDER BY [total_worker_time] DESC;
+------------+-------------+---------------+----------------------+-------------------------+-------------------------+--------------------+------------------+-------------------+-----------------+
|  object_id | database_id | database_name |     trigger_name     | cached_time             | last_execution_time     | total_elapsed_time | avg_elapsed_time | last_elapsed_time | execution_count |
+------------+-------------+---------------+----------------------+-------------------------+-------------------------+--------------------+------------------+-------------------+-----------------+
| 1872725724 | 7           | dwsystem      | DWUserSettings_Mod   | 2018-02-08 08:58:26.660 | 2018-02-08 17:24:58.600 | 20987              | 677              | 495               | 31              |
+------------+-------------+---------------+----------------------+-------------------------+-------------------------+--------------------+------------------+-------------------+-----------------+
| 1648724926 | 7           | dwsystem      | DWWorkFlow_Mod       | 2018-02-08 07:22:01.247 | 2018-02-08 23:22:01.320 | 17030              | 946              | 640               | 18              |
+------------+-------------+---------------+----------------------+-------------------------+-------------------------+--------------------+------------------+-------------------+-----------------+
| 1808725496 | 7           | dwsystem      | DWWorkflowStatus_Mod | 2018-02-08 07:22:23.337 | 2018-02-08 23:22:23.933 | 9409               | 522              | 710               | 18              |
+------------+-------------+---------------+----------------------+-------------------------+-------------------------+--------------------+------------------+-------------------+-----------------+
Run Code Online (Sandbox Code Playgroud)

权限

在 SQL Server 上,需要VIEW SERVER STATE权限。在 SQL 数据库高级层上,需要VIEW SERVER STATE数据库中的权限。在 SQL 数据库标准层和基本层上,需要 服务器管理员Azure Active Directory 管理员帐户。


如果您可以修改触发器,那么您可以使用 TriggerLog 表并在每次触发触发器时添加一条记录(或始终更新)。


让我感谢Sean Gallardy - Microsoft为我提供下一个示例:

CREATE DATABASE TrgTest; 
GO 

USE TrgTest; 
GO 

CREATE TABLE Test 
( 
    ID INT IDENTITY(1,1) 
); 
GO 

CREATE TABLE Logging 
( 
    SomeLoggingCrap VARCHAR(1000) NOT NULL 
) 
GO 

CREATE TRIGGER KittensHateTriggers 
ON dbo.Test 
FOR INSERT 
AS 
BEGIN 
    INSERT INTO Logging(SomeLoggingCrap) 
    SELECT CONCAT('Logged #', ID) FROM inserted 
END 
GO 

DBCC FREEPROCCACHE 

INSERT INTO Test DEFAULT VALUES

SELECT      * 
FROM        sys.dm_exec_query_stats 
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
Run Code Online (Sandbox Code Playgroud)

正如Solomon Rutzky在他的评论中指出的那样,日志表应该存储与执行时间、过程等相关的信息。

CREATE TABLE Test 
( 
    ID INT IDENTITY(1,1) 
); 

CREATE TABLE Logging 
( 
    Id int IDENTITY PRIMARY KEY,
    ProcName sysname NULL,
    SysDate  datetime2(7) NOT NULL
);
GO

CREATE TRIGGER KittensHateTriggers 
ON dbo.Test 
FOR INSERT 
AS 
BEGIN

    INSERT INTO Logging(ProcName, SysDate)
    SELECT so.[name], 
           SYSDATETIME() 
    FROM   sys.objects so 
    WHERE  so.[object_id] = @@PROCID;

END 
GO

INSERT INTO Test DEFAULT VALUES;
GO

SELECT * FROM Logging;
GO
Run Code Online (Sandbox Code Playgroud)

返回:

+----+---------------------+---------------------+
| Id | ProcName            | SysDate             |
+----+---------------------+---------------------+
|  1 | KittensHateTriggers | 09/02/2018 22:39:13 |
+----+---------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)

dbfiddle在这里

我强烈建议查看Solomon 的答案,在这种情况下,与执行答案第一部分所需的 VIEW SERVER STATE 权限有关。

我需要为用户提供哪些最低权限才能检查 SQL Server 代理服务的状态?

从 SQL Server 2005 开始,Microsoft 提供了一种通过“代理”推断权限的机制。权限的代理是登录(对于服务器级别权限)或用户(对于数据库级别权限)。在任何一种情况下,主体(服务器或数据库)都是从非对称密钥或证书创建的,被授予适当的权限,然后通过使用ADD SIGNATURE签署一个或多个代码片段来推断权限。通过这样做,您将授予代码您授予该服务器或数据库主体的权限