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


8

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

それはで表示され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_statsobject_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を受け入れ、その名前を返す関数はありますか?


100%確実ではありませんが、試すことはできますsys.sql_expression_dependencies-> referenced_id参加しsys.objectsますか?
Kin Shah

@Kin sys>オブジェクトまたはすべてのオブジェクトに表示されません。かなり変!
エリックダーリン

ザッツ面白い..方法についてparent_idどおりボル例えばobject_id(object_name(parent_id))
キン・シャー

回答:


9

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

これらのオブジェクトにはOBJECTPROPERTY()ドキュメントなどの特定の制限があることがわかります。

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

そして、同様でドキュメントOBJECTPROPERTYEX()

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

OBJECT_ID()ドキュメントには、もう少し明示されています。

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

OBJECT_NAME()ドキュメントはあまり明示されているが、彼らは暗黙のうちに(強調鉱山)同じ制限に言及します:

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


最初のクエリの場合は、必ずあなたがいるので、機能を経由して名前を取得する必要がない理由nameで列がsys.triggersすでにあなたにその答えを与えます。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などに参加する必要があるかどうかについて心配している場合は、参加しないでください。


ありがとう、アーロン。いいえ、正常に解決されないのは奇妙だと思いました。奇妙な肉があなたを殺さなかったことを嬉しく思います;)
Erik Darling
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.