Eu tenho um gatilho de banco de dados usado para me impedir de criar certos procedimentos nos bancos de dados do usuário.
Aparece em sys.triggers
, com um object_id
, mas não posso 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, eu posso encontrá-lo 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 aceite a identificação do objeto de um acionador no nível do banco de dados e retorne seu nome?
sql-server
trigger
metadata
ddl-trigger
Erik Darling
fonte
fonte
sys.sql_expression_dependencies
->referenced_id
ingressarsys.objects
?parent_id
como por bol, por exemploobject_id(object_name(parent_id))
Respostas:
Os gatilhos no nível do banco de dados e do servidor não têm o escopo definido como "objetos" em si (é por isso que você não pode criá-los em um esquema e por que eles não aparecem
sys.objects
).Você pode ver que esses objetos têm certas restrições sobre eles, por exemplo, os
OBJECTPROPERTY()
documentos :E da mesma forma nos
OBJECTPROPERTYEX()
docs :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 se juntar asys.triggers
:Você pode criar sua própria função, é claro, mas eu não conheço nenhuma função interna que faça essa correlação para você (e eu recomendo ficar longe das funções internas de metadados de qualquer maneira ).
Os gatilhos DDL são um tipo de animal especial. Portanto, se você estiver preocupado com a necessidade de participar de sys.procedures, sys.views etc., não faça isso.
fonte