У меня есть триггер базы данных, который я использую, чтобы предотвратить создание определенных процедур в пользовательских базах данных.
Он появляется в 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;
Существует ли функция, которая будет принимать идентификатор объекта триггера уровня базы данных и возвращать его имя?
sql-server
trigger
metadata
ddl-trigger
Эрик Дарлинг
источник
источник
sys.sql_expression_dependencies
->referenced_id
присоединитьсяsys.objects
?parent_id
согласно бол , напримерobject_id(object_name(parent_id))
Ответы:
Триггеры на уровне базы данных и сервера сами по себе не ограничены как «объекты» (вот почему вы не можете создать их в схеме и почему они не отображаются в ней
sys.objects
).Вы можете видеть , что эти объекты имеют определенные ограничения на них, например , в той
OBJECTPROPERTY()
документации :И точно так же в той
OBJECTPROPERTYEX()
документации :В
OBJECT_ID()
Документах немного более четко:Эти
OBJECT_NAME()
документы являются менее явными, но они упоминают же ограничение неявно (курсив мой):Для первого запроса не уверен, почему вам нужно получить имя через функцию, так как
name
столбецsys.triggers
уже дает вам этот ответ. Для второго запроса вы можете просто присоединиться кsys.triggers
:Конечно, вы можете создать свою собственную функцию, но я не знаю каких-либо встроенных функций, которые бы обеспечивали эту взаимосвязь для вас (и я рекомендую вообще избегать встроенных функций метаданных ).
DDL триггеры являются своего рода специальным животным. Так что если вы беспокоитесь о необходимости присоединиться к sys.procedures, sys.views и т. Д., Не делайте этого.
источник