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.

Índice del recorrido

Desarrollo y exploración

22 artículos de Desarrollo y exploración
  1. 01Buscar una tabla o vista por nombre
  2. 02Buscar una columna en toda la base
  3. 03Buscar texto dentro de procedimientos, vistas y funciones
  4. 04Consultar dependencias de un objeto
  5. 05Listar relaciones y llaves foráneas
  6. 06Consultar llaves primarias, restricciones únicas e índices
  7. 07Listar columnas con tipo, longitud, nulabilidad y valor predeterminado
  8. 08Encontrar triggers y sus tablas asociadas
  9. 09Encontrar objetos modificados recientemente
  10. 10Obtener conteos aproximados de todas las tablas
  11. 11Medir el espacio utilizado por cada tabla
  12. 12Revisar columnas IDENTITY y su valor actual
  13. 13Detectar registros duplicados por una clave de negocio
  14. 14Detectar registros huérfanos
  15. 15Comparar dos conjuntos de datos
  16. 16Validar conversiones antes de modificar una columna
  17. 17Ejecutar un UPDATE con validación y reversión controlada
  18. 18Ejecutar un DELETE con respaldo lógico y reversión controlada
  19. 19Comparar la estructura de dos bases de datos
  20. 20Describir el resultado de una consulta o procedimiento
  21. 21Encontrar tablas sin llave primaria
  22. 22Buscar un valor en columnas seleccionadas