SQL SERVER 2014-トリガーが最後に実行された時刻を知る方法はありますか?
トリガーがキャッシュにある場合、以下を使用できます 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つ以上のコードに署名することにより、アクセス許可が推測されます=。これにより、そのサーバーまたはデータベースプリンシパルに付与したアクセス許可をコードに付与します
最後の実行時間を取得するには、このクエリを実行する必要があります
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をトレースできます