Come posso ottenere la definizione (corpo) di un trigger in SQL Server?
-
09-06-2019 - |
Domanda
Impossibile trovare uno strumento di confronto SQL che soddisfi le mie esigenze, sto scrivendo il mio.Tra le tabelle INFORMAZIONI_SCHEMA e sys, ho una versione funzionante per lo più completa.Ma una cosa che non riesco a trovare nei metadati è il file definizione di un trigger, sai, il vero codice SQL.Sto trascurando qualcosa?
Grazie.
Grazie Pete, non lo sapevo!
Scott, sto lavorando con pacchetti di hosting molto semplici che non consentono connessioni remote al DB.Non so dalle specifiche su RedGate (che comunque non posso permettermi) se forniscono una soluzione alternativa a questo, e sebbene ci siano anche API là fuori (come quella di Apex), non ho visto il punto di investire in una soluzione che avrebbe comunque richiesto maggiore programmazione da parte mia.:)
La mia soluzione è rilasciare una pagina ASPX sul sito che funge da sorta di "servizio schema", restituendo i metadati raccolti come XML.Ho creato una piccola app AJAX che confronta un numero qualsiasi di istanze del catalogo con un master e mostra le differenze.Non è perfetto, ma per me è un grande passo avanti.
Grazie ancora!
Soluzione
sp_helptext funziona per ottenere l'SQL che costituisce un trigger.
La colonna di testo nella vista syscomments contiene anche l'SQL utilizzato per la creazione dell'oggetto.
Altri suggerimenti
Per il 2005 e il 2008 è possibile utilizzare il file OBJECT_DEFINIZIONE() funzione
SELECT
DB_NAME() AS DataBaseName,
dbo.SysObjects.Name AS TriggerName,
dbo.sysComments.Text AS SqlContent
FROM
dbo.SysObjects INNER JOIN
dbo.sysComments ON
dbo.SysObjects.ID = dbo.sysComments.ID
WHERE
(dbo.SysObjects.xType = 'TR')
AND
dbo.SysObjects.Name = '<YourTriggerName>'
Per espandere la risposta di SQLMenace, ecco una semplice query per restituire tutti i trigger e le relative definizioni da un database:
SELECT
sysobjects.name AS trigger_name,
OBJECT_NAME(parent_obj) AS table_name,
OBJECT_DEFINITION(id) AS trigger_definition
FROM sysobjects
WHERE sysobjects.type = 'TR'
questa query restituisce il trigger con il suo nome e corpo.
Select
[tgr].[name] as [trigger name],
[tbl].[name] as [table name] ,
OBJECT_DEFINITION(tgr.id) body
from sysobjects tgr
join sysobjects tbl
on tgr.parent_obj = tbl.id
WHERE tgr.xtype = 'TR'