Encontrar triggers y sus tablas asociadas
Señal o problema observado
Un INSERT, UPDATE o DELETE produce cambios adicionales, rechaza una operación o tarda más de lo esperado. Parte de esa lógica puede estar en un trigger y ejecutarse sin aparecer en la instrucción original.
Qué necesitamos distinguir
Un trigger es código que SQL Server ejecuta automáticamente ante determinados eventos. DML reúne operaciones sobre datos, como INSERT, UPDATE y DELETE; DDL reúne cambios de definición, como CREATE o ALTER.
Queremos identificar el trigger, su objeto asociado, los eventos que lo activan y si se ejecuta como AFTER o INSTEAD OF. También conviene separar triggers DML asociados a tablas o vistas de triggers DDL asociados a la base.
Consulta
DECLARE @Objeto NVARCHAR(517) = NULL;
DECLARE @IdObjeto INT =
CASE WHEN @Objeto IS NULL THEN NULL ELSE OBJECT_ID(@Objeto) END;
IF @Objeto IS NOT NULL AND @IdObjeto IS NULL
THROW 50000, 'El objeto no existe o no es visible en esta base.', 1;
SELECT
tr.name AS Trigger,
tr.parent_class_desc AS Alcance,
s.name AS Esquema,
o.name AS ObjetoAsociado,
o.type_desc AS TipoObjeto,
ev.type_desc AS Evento,
CASE
WHEN tr.is_instead_of_trigger = 1 THEN N'INSTEAD OF'
ELSE N'AFTER'
END AS Momento,
tr.is_disabled AS EstaDeshabilitado,
tr.is_not_for_replication AS NoSeEjecutaEnReplicacion,
tr.modify_date AS FechaModificacion
FROM sys.triggers AS tr
LEFT JOIN sys.objects AS o
ON tr.parent_class = 1
AND o.object_id = tr.parent_id
LEFT JOIN sys.schemas AS s
ON s.schema_id = o.schema_id
LEFT JOIN sys.trigger_events AS ev
ON ev.object_id = tr.object_id
WHERE tr.is_ms_shipped = 0
AND (@IdObjeto IS NULL OR tr.parent_id = @IdObjeto)
ORDER BY
s.name,
o.name,
tr.name,
ev.type_desc;
Parámetros o permisos
Deja @Objeto en NULL para listar todos los triggers visibles de la base, o escribe dbo.Pedido para limitar la búsqueda. Cada evento produce una fila, así que un mismo trigger puede aparecer varias veces.
Los metadatos están sujetos a permisos. La definición del código puede revisarse con OBJECT_DEFINITION(tr.object_id) cuando la cuenta tiene VIEW DEFINITION.
Cómo leer el resultado
AFTER ejecuta el trigger después de que la operación supera sus comprobaciones. INSTEAD OF ejecuta el trigger en lugar de la operación original.
En un trigger DML, ObjetoAsociado identifica la tabla o vista sobre la que está definido. En un trigger DDL de base, el objeto y el esquema aparecen como NULL y Alcance indica DATABASE.
Evento puede mostrar INSERT, UPDATE, DELETE o un evento DDL. INSTEAD OF reemplaza la operación original; AFTER se ejecuta después de que la instrucción y sus comprobaciones correspondientes hayan tenido éxito.
EstaDeshabilitado = 1 conserva la definición, pero impide que el trigger se ejecute. La fecha de modificación es una pista para investigar cambios, no un historial.
Qué conclusión sí permite obtener
Permite afirmar qué triggers visibles están definidos, qué evento los activa, cuál es su alcance y si se encuentran habilitados.
Qué conclusión todavía no permite obtener
No demuestra que el trigger se haya ejecutado en una operación concreta ni cuánto tiempo consumió. Tampoco explica su lógica, su orden frente a otros triggers o si maneja correctamente operaciones de varias filas.
Un trigger deshabilitado hoy pudo haber estado activo cuando se produjo un dato histórico.
Siguiente comprobación razonable
inserted y deleted son imágenes lógicas: representaciones temporales de las filas nuevas y anteriores, no tablas permanentes.
Lee la definición completa y busca usos de las tablas lógicas inserted y deleted. Después reproduce la operación dentro de un ambiente controlado y comprueba todas las filas afectadas, no solamente una.