觸發器執行的最後時間
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