Share via


Programar desencadenadores DML

Para escribir un desencadenador DML puede utilizar casi todas las instrucciones Transact-SQL que se puedan escribir como un lote, excepto las siguientes:

ALTER DATABASE

CREATE DATABASE

DROP DATABASE

LOAD DATABASE

LOAD LOG

RECONFIGURE

RESTORE DATABASE

RESTORE LOG

 

ms190227.note(es-es,SQL.90).gifImportante:
Las instrucciones LOAD DATABASE y LOAD LOG se incluyen en SQL Server 2005 únicamente por motivos de compatibilidad con versiones anteriores y es posible que en versiones futuras no se admitan.

Además, las siguientes instrucciones de Transact-SQL no se permiten dentro del cuerpo de un desencadenador DML cuando se utilizan en la tabla o en la vista que es el destino de la acción de desencadenamiento:

ms190227.note(es-es,SQL.90).gifImportante:
Aunque esta restricción se presenta en SQL Server 2005, también se exige cuando el modo de compatibilidad con versiones anteriores está establecido en 80.

CREATE INDEX

ALTER INDEX

DROP INDEX

DBCC DBREINDEX

ALTER PARTITION FUNCTION

DROP TABLE

ALTER TABLE cuando se utiliza para:

  • Agregar, modificar o quitar columnas.
  • Alternar entre particiones.
  • Agregar o quitar claves principales o restricciones únicas.

 

 

Proteger definiciones de desencadenadores DML

Para proteger el texto original de la instrucción CREATE TRIGGER, utilice la opción WITH ENCRYPTION. La salida con protección no se puede ver directamente en ninguna de las vistas o tablas del sistema de SQL Server 2005. Los usuarios sin acceso a las tablas o vistas del sistema, o a los archivos de base de datos no pueden recuperar el texto protegido. Sin embargo, el texto estará disponible a los usuarios con privilegios que tengan acceso directo a los archivos de base de datos. Estos usuarios pueden aplicar ingeniería inversa a la protección para recuperar el texto original de la definición del desencadenador.

El uso de WITH ENCRYPTION impide que el desencadenador se publique como parte de la réplica de SQL Server.

Opciones de la instrucción SET

Cuando se conecta una aplicación ODBC a SQL Server, el servidor configura automáticamente estas opciones para la sesión:

  • SET QUOTED_IDENTIFIER ON
  • SET TEXTSIZE 2147483647
  • SET ANSI_DEFAULTS ON
  • SET CURSOR_CLOSE_ON_COMMIT OFF
  • SET IMPLICIT_TRANSACTIONS OFF

Esta configuración aumenta la portabilidad de las aplicaciones ODBC. Como las aplicaciones basadas en DB-Library no establecen estas opciones en general, se deben probar los desencadenadores con las opciones SET antes mostradas establecidas en ON y OFF. Esto garantiza que los desencadenadores funcionan correctamente, independientemente de las opciones que haya configurado una conexión determinada al llamar al desencadenador. Un desencadenador que necesite una configuración concreta para una de esas opciones deberá emitir una instrucción SET al principio del desencadenador. Esta instrucción SET sólo permanecerá vigente durante la ejecución del desencadenador; cuando se complete la acción del desencadenador, se restablecerá la configuración original.

Probar cambios de columnas determinadas

La función UPDATE() se puede usar para determinar si una declaración INSERT o UPDATE ha afectado a una columna específica de la tabla. La función devuelve TRUE (verdadero) siempre que se haya asignado un valor a la columna.

[!NOTA] Ya que no es posible eliminar un valor específico de una columna mediante la instrucción DELETE, el uso de la cláusula IF UPDATE no se aplica a esta instrucción.

Como alternativa, la función COLUMNS_UPDATED se puede utilizar para comprobar qué columnas de la tabla se actualizaron mediante una instrucción INSERT o UPDATE. Esta función utiliza una máscara de bits de enteros para especificar las columnas que deben comprobarse. Para obtener más información, vea CREATE TRIGGER.

Ejemplos

A. Utilizar la cláusula IF UPDATE() para probar las modificaciones de datos

En el ejemplo siguiente se crea un desencadenador INSERT denominado my_trig en la tabla my_table y se comprueba si la columna b se ha visto afectada por algún intento de INSERT.

CREATE TABLE my_table*
(a int NULL, b int NULL)
GO

CREATE TRIGGER my_trig
ON my_table
FOR INSERT
AS
IF UPDATE(b)
   PRINT 'Column b Modified'
GO

B. Utilizar la función COLUMNS UPDATED para probar las modificaciones de datos

Puede obtener resultados similares en el siguiente ejemplo con la cláusula COLUMNS_UPDATED():

CREATE TRIGGER my_trig2
ON my_table
FOR INSERT
AS
IF ( COLUMNS_UPDATED() & 2 = 2 )
   PRINT 'Column b Modified'
GO

Resolución diferida de nombres

Los desencadenadores DML pueden hacer referencia a tablas que no existen en tiempo de creación del desencadenador. Esta capacidad se llama resolución diferida de nombres. Para obtener más información acerca de la resolución diferida de nombres, vea Resolución diferida de nombres y compilación.

[!NOTA] Si se elimina o se cambia el nombre de un objeto al que hace referencia un desencadenador DML, se devolverá un error cuando se ejecute el desencadenador. No obstante, si un objeto al que se hace referencia en un desencadenador DML se reemplaza por otro objeto con el mismo nombre, el desencadenador se ejecuta sin tener que volver a crearlo primero. Por ejemplo, si el desencadenador trig1 hace referencia a la tabla test1, se elimina test1 y se crea una tabla diferente denominada test1, trig1 ahora hace referencia a la nueva tabla.

Devolver resultados

Es recomendable que los desencadenadores DML no devuelvan resultados. Esto es así porque para los resultados devueltos se debe escribir un procesamiento especial en todas las aplicaciones en que se permite modificar el desencadenador. Para evitar que un desencadenador DML devuelva resultados, no incluya instrucciones SELECT ni asignaciones variables en su definición. Si es preciso que existan asignaciones de variable en un desencadenador, utilice una instrucción SET NOCOUNT antes del mismo para eliminar la devolución de cualquier conjunto de resultados.

ms190227.note(es-es,SQL.90).gifImportante:
La capacidad de devolver conjuntos de resultados desde desencadenadores se eliminará en una versión posterior de SQL Server. Evite la devolución de conjuntos de resultados desde desencadenadores en los nuevos trabajos de desarrollo y piense en modificar las aplicaciones que la usan actualmente. Para impedir que los desencadenadores devuelvan conjuntos de resultados en SQL Server 2005, establezca disallow results from triggers (opción) en 1. El valor predeterminado de esta opción será 1 en una versión posterior de SQL Server.

Vea también

Otros recursos

CREATE TRIGGER (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Lanzamiento Historial
Contenido modificado:
  • Se reemplazó "Cifrar definiciones de desencadenadores DML" por "Proteger definiciones de desencadenadores DML.