ユーザーデータベースに特定のプロシージャを作成できないようにするために使用する データベーストリガー があります。
それはsys.triggers
にobject_id
とともに表示されますが、object_id
関数を使用してそれを見つけることはできません。
SELECT OBJECT_ID(t.name, t.type) AS object_id, *
FROM sys.triggers AS t;
同様に、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;
データベースレベルのトリガーのオブジェクトIDを受け入れ、その名前を返す関数はありますか?
データベースレベルおよびサーバーレベルのトリガーは、それ自体「オブジェクト」としてスコープされません(これが、スキーマの下でトリガーを作成できず、_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などに参加する必要があるかどうかについて心配している場合は、参加しないでください。