¿Cómo puedo resolver el nombre del activador de una base de datos con funciones integradas?


8

Tengo un activador de base de datos que uso para evitar que cree ciertos procedimientos en las bases de datos de los usuarios.

Aparece en sys.triggers, con un object_id, pero no puedo usar la object_idfunción para encontrarlo.

SELECT OBJECT_ID(t.name, t.type) AS object_id, *
FROM   sys.triggers AS t;

NUECES

Del mismo modo, puedo encontrarlo en sys.dm_exec_trigger_stats. No puedo object_nameresolver, pero lo object_definitionhace.

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;

NUECES

¿Existe una función que acepte la identificación de objeto del activador de nivel de base de datos y devuelva su nombre?


No es 100% seguro, pero se puede tratar sys.sql_expression_dependencies-> referenced_idunirse sys.objects?
Kin Shah

@Kin no aparece en sys> objetos o en todos los objetos. ¡Bastante raro!
Erik Darling

Eso es interesante ... ¿qué parent_idtal según bol, por ejemplo?object_id(object_name(parent_id))
Kin Shah

Respuestas:


9

Los desencadenantes a nivel de la base de datos y del servidor no tienen alcance como "objetos" per se (es por eso que no puede crearlos bajo un esquema, y ​​por qué no aparecen en sys.objects).

Puede ver que estos objetos tienen ciertas restricciones, por ejemplo en los OBJECTPROPERTY()documentos :

Esta función no se puede usar para objetos que no tienen un alcance de esquema, como los desencadenadores del lenguaje de definición de datos (DDL) y las notificaciones de eventos.

Y de manera similar en los OBJECTPROPERTYEX()documentos :

OBJECTPROPERTYEX no se puede usar para objetos que no tienen un alcance de esquema, como los desencadenadores del lenguaje de definición de datos (DDL) y las notificaciones de eventos.

Los OBJECT_ID()documentos son un poco más explícitos:

Los objetos que no tienen un alcance de esquema, como los desencadenadores DDL, no pueden consultarse utilizando OBJECT_ID. Para los objetos que no se encuentran en la vista de catálogo sys.objects, obtenga los números de identificación de objeto consultando la vista de catálogo adecuada. Por ejemplo, para devolver el número de identificación de objeto de un desencadenador DDL, use SELECT OBJECT_ID FROM sys.triggers WHERE name = 'DatabaseTriggerLog'.

Los OBJECT_NAME()documentos son menos explícitos, pero mencionan la misma restricción implícitamente (el énfasis es mío):

Devuelve el nombre del objeto de la base de datos para objetos con ámbito de esquema .


Para la primera consulta, no estoy seguro de por qué necesita obtener el nombre a través de la función, ya que la namecolumna sys.triggersya le da esa respuesta. Para la segunda consulta, puede unirse a 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];

Podría crear su propia función, por supuesto, pero no conozco ninguna función integrada que haga esta correlación por usted (y, de todos modos, recomiendo mantenerse alejado de las funciones de metadatos integradas ).

Los desencadenantes de DDL son una especie de animal especial. Entonces, si le preocupa también tener que unirse a sys.procedures, sys.views, etc., no lo haga.


Gracias Aaron. No, me pareció extraño que no se resolvieran normalmente . Me alegro de que la carne extraña no te haya matado;)
Erik Darling
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.