Eu tenho um gatilho de banco de dados que uso para me impedir de criar determinados procedimentos em bancos de dados de usuários.
Ele aparece em sys.triggers
, com um object_id
, mas não consigo usar a object_id
função para encontrá-lo.
SELECT OBJECT_ID(t.name, t.type) AS object_id, *
FROM sys.triggers AS t;
Da mesma forma, posso encontrá-lo em sys.dm_exec_trigger_stats
. Não consigo object_name
resolver, mas resolve 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;
Existe uma função que aceitará o id de objeto de um gatilho de nível de banco de dados e retornará seu nome?
Os gatilhos no nível do banco de dados e do servidor não têm escopo como "objetos" per se (é por isso que você não pode criá-los em um esquema e por que eles não aparecem em
sys.objects
).Você pode ver que esses objetos têm certas restrições, por exemplo nos
OBJECTPROPERTY()
documentos :E da mesma forma nos
OBJECTPROPERTYEX()
documentos :Os
OBJECT_ID()
documentos são um pouco mais explícitos:Os
OBJECT_NAME()
documentos são menos explícitos, mas mencionam a mesma restrição implicitamente (ênfase minha):Para a primeira consulta, não sei por que você precisa obter o nome por meio da função, pois a
name
colunasys.triggers
já fornece essa resposta. Para a segunda consulta, você pode simplesmente juntar-se asys.triggers
:Você pode criar sua própria função, é claro, mas não conheço nenhuma função interna que faça essa correlação para você (e eu recomendo ficar longe das funções de metadados internas geralmente de qualquer maneira ).
Os gatilhos DDL são uma espécie de animal especial. Portanto, se você está preocupado em também ter que se juntar a sys.procedures, sys.views, etc., não faça isso.