web-dev-qa-db-ja.com

組み込み関数を使用してデータベーストリガーの名前を解決するにはどうすればよいですか?

ユーザーデータベースに特定のプロシージャを作成できないようにするために使用する データベーストリガー があります。

それはsys.triggersobject_idとともに表示されますが、object_id関数を使用してそれを見つけることはできません。

SELECT OBJECT_ID(t.name, t.type) AS object_id, *
FROM   sys.triggers AS t;

NUTS

同様に、sys.dm_exec_trigger_statsにもあります。 object_nameで解決できませんが、object_definitionで解決できます。

SELECT OBJECT_NAME(dets.object_id, dets.database_id) AS object_name,
       OBJECT_DEFINITION(dets.object_id) AS object_definition,
       *
FROM   sys.dm_exec_trigger_stats AS dets;

NUTS

データベースレベルのトリガーのオブジェクトIDを受け入れ、その名前を返す関数はありますか?

8
Erik Darling

データベースレベルおよびサーバーレベルのトリガーは、それ自体「オブジェクト」としてスコープされません(これが、スキーマの下でトリガーを作成できず、_sys.objects_に表示されない理由です)。

これらのオブジェクトには、たとえば the OBJECTPROPERTY() docs のような特定の制限があることがわかります。

この関数は、データ定義言語(DDL)トリガーやイベント通知など、スキーマスコープではないオブジェクトには使用できません。

そして同様に the OBJECTPROPERTYEX() docs

OBJECTPROPERTYEXは、データ定義言語(DDL)トリガーやイベント通知など、スキーマスコープではないオブジェクトには使用できません。

OBJECT_ID()ドキュメントはもう少し明示的です:

DDLトリガーなどのスキーマスコープではないオブジェクトは、OBJECT_IDを使用してクエリすることはできません。 sys.objectsカタログビューで見つからないオブジェクトの場合は、適切なカタログビューをクエリしてオブジェクトの識別番号を取得します。たとえば、DDLトリガーのオブジェクト識別番号を返すには、_SELECT OBJECT_ID FROM sys.triggers WHERE name = 'DatabaseTriggerLog_ 'を使用します。

The OBJECT_NAME() docs はそれほど明確ではありませんが、同じ制限について暗黙のうちに言及しています(強調は私のものです):

データベースオブジェクト名スキーマスコープオブジェクトの場合を返します。


最初のクエリでは、なぜ_sys.triggers_のname列がその答えを提供しているので、関数を介して名前を取得する必要がある理由がわかりません。 2番目のクエリでは、_sys.triggers_に結合するだけです。

_SELECT tr.*, ts.*
FROM sys.dm_exec_trigger_stats AS ts
LEFT OUTER JOIN sys.triggers AS tr
ON ts.[object_id] = tr.[object_id];
_

もちろん、独自の関数を作成することもできますが、この相関を行う組み込み関数はわかりません(そして とにかく、組み込みメタデータ関数から離れることをお勧めします )。 。

DDLトリガーは一種の特殊な動物です。そのため、sys.procedures、sys.viewsなどに参加する必要があるかどうかについて心配している場合は、参加しないでください。

9
Aaron Bertrand