¿Cómo puedo obtener la definición (cuerpo) de un disparador en SQL Server?
-
09-06-2019 - |
Pregunta
Al no poder encontrar una herramienta de diferenciación de SQL que satisfaga mis necesidades, estoy escribiendo la mía propia.Entre las tablas INFORMACIÓN_SCHEMA y sys, tengo una versión funcional casi completa.Pero una cosa que no puedo encontrar en los metadatos es el definición de un disparador, ya sabes, el código SQL real.¿Estoy pasando por alto algo?
Gracias.
Gracias Pete, ¡no sabía nada de eso!
Scott, estoy trabajando con paquetes de hosting muy básicos que no permiten conexiones remotas a la base de datos.No sé por las especificaciones de RedGate (que de todos modos no puedo pagar) si proporcionan una solución alternativa para eso, y aunque también existen API (como la de Apex), no vi la No tenía sentido invertir en una solución que todavía iba a requerir más programación de mi parte.:)
Mi solución es colocar una página ASPX en el sitio que actúe como una especie de "servicio de esquema" y devuelva los metadatos recopilados como XML.Configuré una pequeña aplicación AJAX que compara cualquier número de instancias de catálogo con un maestro y muestra las diferencias.No es perfecto, pero es un gran paso adelante para mí.
¡Gracias de nuevo!
Solución
sp_helptext funciona para obtener el SQL que constituye un disparador.
La columna de texto en la vista syscomments también contiene el sql utilizado para la creación de objetos.
Otros consejos
Para 2005 y 2008 puede utilizar el OBJETO_DEFINICIÓN() función
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>'
Para ampliar la respuesta de SQLMenace, aquí hay una consulta simple para devolver todos los activadores y sus definiciones desde una base de datos:
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'
esta consulta devuelve el disparador con su nombre y cuerpo.
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'