Come posso risolvere il nome di un trigger di database con funzioni integrate?


8

Ho un trigger di database che utilizzo per impedirmi di creare determinate procedure nei database degli utenti.

Appare in sys.triggers, con un object_id, ma non riesco a usare la object_idfunzione per trovarlo.

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

NOCCIOLINE

Allo stesso modo, posso trovarlo in sys.dm_exec_trigger_stats. Non riesco object_namea risolvere, ma lo object_definitionfa.

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;

NOCCIOLINE

Esiste una funzione che accetta l'ID oggetto di un trigger a livello di database e ne restituisce il nome?


Non sei sicuro al 100% ma puoi provare sys.sql_expression_dependencies-> referenced_idunirti sys.objects?
Kin Shah,

@Kin non viene visualizzato in sys> oggetti o in tutti gli oggetti. Abbastanza strano!
Erik Darling,

Questo è interessante .. che ne dici parent_iddi Bol, ad esempioobject_id(object_name(parent_id))
Kin Shah,

Risposte:


9

I trigger a livello di database e server non sono definiti come "oggetti" di per sé (per questo motivo non è possibile crearli in uno schema e perché non vengono visualizzati in sys.objects).

Si può vedere che questi oggetti hanno alcune restrizioni su di loro, per esempio nei OBJECTPROPERTY()documenti :

Questa funzione non può essere utilizzata per oggetti che non rientrano nell'ambito dello schema, ad esempio trigger DDL (Data Definition Language) e notifiche di eventi.

E allo stesso modo nei OBJECTPROPERTYEX()documenti :

OBJECTPROPERTYEX non può essere utilizzato per oggetti che non hanno ambito, come i trigger DDL (Data Definition Language) e le notifiche degli eventi.

I OBJECT_ID()documenti sono un po 'più espliciti:

Gli oggetti non con ambito schema, come i trigger DDL, non possono essere interrogati utilizzando OBJECT_ID. Per gli oggetti che non si trovano nella vista del catalogo sys.objects, ottenere i numeri di identificazione dell'oggetto eseguendo una query sulla vista del catalogo appropriata. Ad esempio, per restituire il numero di identificazione dell'oggetto di un trigger DDL, utilizzare SELECT OBJECT_ID FROM sys.triggers WHERE name = 'DatabaseTriggerLog'.

I OBJECT_NAME()documenti sono meno espliciti, ma menzionano implicitamente la stessa restrizione (sottolineatura mia):

Restituisce il nome dell'oggetto del database per gli oggetti con ambito schema .


Per la prima query, non sei sicuro del motivo per cui devi ottenere il nome tramite la funzione, poiché la namecolonna in sys.triggersti dà già quella risposta. Per la seconda query, puoi semplicemente unirti 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];

Potresti creare la tua funzione, ovviamente, ma non conosco nessuna funzione integrata che faccia questa correlazione per te (e in ogni caso ti consiglio di stare alla larga dalle funzioni di metadati integrate ).

I trigger DDL sono una specie di animale speciale. Quindi, se sei preoccupato di dover anche partecipare a sys.procedures, sys.views, ecc., Non farlo.


Grazie Aaron. No, ho trovato strano che non si risolvessero normalmente . Sono contento che quella strana carne non ti abbia ucciso;)
Erik Darling,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.