web-dev-qa-db-ja.com

トリガー実行の最後の時間

SQL SERVER 2014-トリガーが最後に実行された時刻を知る方法はありますか?

3
Prashant

トリガーがキャッシュにある場合、以下を使用できます sys.dm_exec_trigger_stats

キャッシュされたトリガーのパフォーマンス統計情報を返します。ビューにはトリガーごとに1つの行が含まれ、行の存続期間はトリガーがキャッシュされたままである限りです。トリガーがキャッシュから削除されると、対応する行がこのビューから削除されます。

 SELECT 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              |
+------------+-------------+---------------+----------------------+-------------------------+-------------------------+--------------------+------------------+-------------------+-----------------+

権限

SQL Serverでは、 VIEW SERVER STATE 許可。 SQL Database Premium Tiersでは、 VIEW SERVER STATE データベースの権限。 SQLデータベースの標準層と基本層では、Server adminまたはAzure Active Directory adminアカウント。


トリガーを変更できる場合は、トリガーが起動されるたびに、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 がコメントで指摘したように、Loggingテーブルは実行時間、プロシージャなどに関する情報を格納する必要があります。

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 ここ

そして、私は ソロモンの回答 を確認することを強くお勧めします。この場合、回答の最初の部分を実行するために必要なVIEW SERVER STATE権限に関連しています。

SQL Serverエージェントサービスのステータスを確認できるように、ユーザーに提供する必要のある最低限の権限は何ですか?

SQL Server 2005以降、Microsoftは「プロキシ」を介してアクセス許可を推測するメカニズムを提供しました。アクセス許可のプロキシは、ログイン(サーバーレベルのアクセス許可の場合)またはユーザー(データベースレベルのアクセス許可の場合)です。どちらの場合も、プリンシパル(サーバーまたはデータベース)は非対称キーまたは証明書のいずれかから作成され、適切なアクセス許可が付与されます。次に、 ADD SIGNATURE を使用して1つ以上のコードに署名することにより、アクセス許可が推測されます=。これにより、そのサーバーまたはデータベースプリンシパルに付与したアクセス許可をコードに付与します

12
McNets

最後の実行時間を取得するには、このクエリを実行する必要があります

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プロファイラを使用して、実行中にTRIGGERをトレースできます

0
CR241