我有一个数据库触发器,用于防止我在用户数据库中创建某些过程。
它出现在 中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
)。您可以看到这些对象对它们有一定的限制,例如在文档
OBJECTPROPERTY()
中:同样在文档
OBJECTPROPERTYEX()
中:OBJECT_ID()
文档更明确一些:OBJECT_NAME()
文档不太明确,但他们隐含地提到了相同的限制(强调我的):对于第一个查询,不确定为什么需要通过函数获取名称,因为中的
name
列sys.triggers
已经为您提供了答案。对于第二个查询,您可以加入sys.triggers
:当然,您可以创建自己的函数,但我不知道有任何内置函数可以为您进行这种关联(而且我建议通常无论如何都远离内置元数据函数)。
DDL 触发器是一种特殊的动物。因此,如果您担心还必须加入 sys.procedures、sys.views 等,请不要这样做。