Sql-Server

觸發器執行的最後時間

  • February 15, 2018

SQL SERVER 2014 - 有沒有辦法知道觸發器執行的最後時間?

如果您的觸發器**在記憶體中,**您可以使用: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 
按 [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              |
+------------+-------------+---------------+----------------------+-------------------------+-------------------------+--------------------+------------------+-------------------+-----------------+

權限

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

正如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

回報:

+----+---------------------+---------------------+
| Id | ProcName            | SysDate             |
+----+---------------------+---------------------+
|  1 | KittensHateTriggers | 09/02/2018 22:39:13 |
+----+---------------------+---------------------+

dbfiddle在這裡

我強烈建議您查看Solomon 的答案,在這種情況下,與執行答案第一部分所需的 VIEW SERVER STATE 權限有關。

我需要向使用者提供哪些最低權限才能檢查 SQL Server 代理服務的狀態?

從 SQL Server 2005 開始,Microsoft 提供了一種通過“代理”推斷權限的機制。權限的代理是登錄名(用於伺服器級權限)或使用者(用於數據庫級權限)。在任何一種情況下,主體(伺服器或數據庫)都是從非對稱密鑰或證書創建的,被授予適當的權限,然後通過使用ADD SIGNATURE對一段或多段程式碼進行簽名來推斷權限。通過這樣做,您將授予程式碼您已授予該伺服器或數據庫主體的權限

您將需要執行此查詢以獲取上次執行時間

SELECT TOP 1 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
WHERE OBJECT_NAME(object_id, database_id)='TriggerName'
ORDER BY [total_worker_time] DESC;

您仍然沒有收到觸發器資訊,請檢查此連結sys.dm_exec_trigger_stats (Transact-SQL)

SELECT * FROM sys.dm_exec_trigger_stats查詢包含記憶體的時間和触發器的最後執行時間。

如果您有任何權限錯誤:使用者無權執行此操作。

消息很清楚,您沒有權限查詢這些資訊,它需要伺服器上的VIEW SERVER STATE權限。

通過使用SQL Profiler,我們可以在執行時跟踪 TRIGGER

引用自:https://dba.stackexchange.com/questions/197444