Vous êtes sur la page 1sur 13

CREATE TRIGGER (Transact-SQL)

SQL Server 2005


Otras versiones

Actualizado: 17 de julio de 2006 Crea un desencadenador DML, DDL o logon. Un desencadenador es una clase especial de procedimiento almacenado que se ejecuta automticamente cuando se produce un evento en el servidor de bases de datos. Los desencadenadores DML se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulacin de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.

Nota:
Estos desencadenadores se activan cuando se produce algn evento no vlido, independientemente de si afecta a la fila de alguna tabla o no. Esto es as por diseo.

Los desencadenadores DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definicin de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL. Los desencadenadores logon se activan en respuesta al evento LOGON que se genera cuando se establece la sesin de un usuario. Los desencadenadores se pueden crear en SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) directamente a partir de instrucciones de Transact-SQL o de mtodos de ensamblados que se crean en Common Language Runtime (CLR) de Microsoft .NET Framework y se cargan en una instancia de SQL Server. SQL Server permite crear varios desencadenadores para una instruccin especfica.

Nota de seguridad:
El cdigo daino de los desencadenadores se puede ejecutar bajo privilegios escalados. Para obtener ms informacin acerca de cmo mitigar esta amenaza, vea Administrar la seguridad de los desencadenadores.

Convenciones de sintaxis de Transact-SQL

Sintaxis
Copiar Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > } <dml_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> ::=

assembly_name.class_name.method_name Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE STATISTICS statement (DDL Trigger) CREATE TRIGGER trigger_name ON { ALL SERVER | DATABASE } [ WITH <ddl_trigger_option> [ ,...n ] ] { FOR | AFTER } { event_type | event_group } [ ,...n ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] } <ddl_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> ::= assembly_name.class_name.method_name Trigger on a LOGON event (Logon Trigger) CREATE TRIGGER trigger_name ON ALL SERVER [ WITH <logon_trigger_option> [ ,...n ] ] { FOR | AFTER } LOGON AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier> <logon_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> ::= assembly_name.class_name.method_name

[ ; ] }

Argumentos
schema_name Es el nombre del esquema al que pertenece un desencadenador DML. Los desencadenadores DML se limitan al esquema de la tabla o vista en la que se crearon. No se puede especificar schema_name para desencadenadores DDL o logon. trigger_name Es el nombre del desencadenador. El parmetro trigger_name debe cumplir con las reglas de los identificadores, con la excepcin de que trigger_name no puede comenzar con los smbolos # o ##. table | view Es la tabla o vista en que se ejecuta el desencadenador DML; algunas veces se denomina tabla del desencadenador o vista del desencadenador. Especificar el nombre completo de la tabla o vista es opcional. Slo se puede hacer referencia a una vista mediante un desencadenador INSTEAD OF. No es posible definir desencadenadores DML en tablas temporales locales o globales. DATABASE Aplica el mbito de un desencadenador DDL a la base de datos actual. Si se especifica, el desencadenador se activa cada vez que event_type o event_group tienen lugar en la base de datos actual. ALL SERVER Aplica el mbito de un desencadenador DDL o logon al servidor actual. Si se especifica, el desencadenador se activa cada vez que event_type o event_group tienen lugar en la base de datos actual. WITH ENCRYPTION

Ofusca el texto de la instruccin CREATE TRIGGER. El uso de WITH ENCRYPTION impide que el desencadenador se publique como parte de la rplica de SQL Server. WITH ENCRYPTION no se puede especificar para desencadenadores CLR. EXECUTE AS Especifica el contexto de seguridad en el que se ejecuta el desencadenador. Permite controlar qu cuenta de usuario utiliza la instancia de SQL Server para validar los permisos sobre cualquier objeto de base de datos al que haga referencia el desencadenador. Para obtener ms informacin, vea EXECUTE AS (clusula de Transact-SQL). FOR | AFTER AFTER especifica que el desencadenador slo se activa cuando todas las operaciones especificadas en la instruccin SQL desencadenadora se han ejecutado correctamente. Adems, todas las acciones referenciales en cascada y las comprobaciones de restricciones deben ser correctas para que este desencadenador se ejecute. AFTER es el valor predeterminado cuando slo se especifica la palabra clave FOR. Los desencadenadores AFTER no se pueden definir en las vistas. INSTEAD OF Especifica que se ejecuta el desencadenador DML en vez de la instruccin SQL desencadenadora, por lo que se suplantan las acciones de las instrucciones desencadenadoras. INSTEAD OF no se puede especificar para los desencadenadores DDL o logon. Como mximo, se puede definir un desencadenador INSTEAD OF por cada instruccin INSERT, UPDATE o DELETE en cada tabla o vista. No obstante, en las vistas es posible definir otras vistas que tengan su propio desencadenador INSTEAD OF. Los desencadenadores INSTEAD OF no se pueden utilizar en vistas actualizables que usan WITH CHECK OPTION. SQL Server genera un error cuando se agrega un desencadenador INSTEAD OF a una vista actualizable para la que se especific WITH CHECK OPTION. El usuario debe quitar esta opcin mediante ALTER VIEW antes de definir el desencadenador INSTEAD OF. { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } Especifica las instrucciones de modificacin de datos que activan el desencadenador DML cuando se intenta en esta tabla o vista. Se debe especificar al menos una opcin. En la definicin del desencadenador se permite cualquier combinacin de estas opciones, en cualquier orden. Para los desencadenadores INSTEAD OF, no se permite la opcin DELETE en tablas que tengan una relacin de integridad referencial que especifica una accin ON DELETE en cascada. Igualmente, no se permite la opcin UPDATE en tablas que tengan una relacin de integridad referencial que especifica una accin ON UPDATE en cascada. event_type Es el nombre de un evento de lenguaje Transact-SQL que hace que, una vez ejecutado, se active un desencadenador DDL. Los eventos vlidos para su uso en desencadenadores DDL se enumeran en Usar eventos de DDL con desencadenadores DDL. event_group Es el nombre de un agrupamiento predefinido de eventos de lenguaje de Transact-SQL. El desencadenador DDL se activa tras la ejecucin de cualquier evento de lenguaje Transact-SQL que pertenezca a event_group. Los grupos de eventos vlidos para su uso en desencadenadores DDL se enumeran en Usar grupos de eventos con desencadenadores DDL.

Una vez que CREATE TRIGGER ha terminado de ejecutarse, event_group tambin acta como una macro al agregar los tipos de eventos que comprende a la vista de catlogo sys.trigger_events. WITH APPEND Especifica que debe agregarse un desencadenador adicional de un tipo existente. La utilizacin de esta clusula opcional slo es necesaria cuando el nivel de compatibilidad es 65 o inferior. Si el nivel de compatibilidad es 70 o superior, no es necesaria la clusula WITH APPEND para agregar un desencadenador adicional de un tipo existente. ste es el comportamiento predeterminado de CREATE TRIGGER cuando el nivel de compatibilidad es 70 o superior. Para obtener ms informacin, vea sp_dbcmptlevel (Transact-SQL). WITH APPEND no se puede utilizar con desencadenadores INSTEAD OF o cuando se ha declarado AFTER explcitamente. WITH APPEND slo se puede utilizar si se especific FOR (sin INSTEAD OF ni AFTER) por motivos de compatibilidad con versiones anteriores. WITH APPEND no se puede especificar si se ha especificado EXTERNAL NAME (es decir, si el desencadenador es de tipo CLR).

Importante:
WITH APPEND se quitar en una versin futura de Microsoft SQL Server. Evite su uso en los nuevos trabajos de desarrollo y piense en modificar las aplicaciones que la usan actualmente. NOT FOR REPLICATION Indica que el desencadenador no debe ejecutarse cuando un agente de rplica modifica la tabla involucrada en el mismo. Para obtener ms informacin, vea Controlar restricciones, identidades y desencadenadores con NOT FOR REPLICATION. sql_statement Son las condiciones y acciones del desencadenador. Las condiciones del desencadenador especifican los criterios adicionales que determinan si los intentos de los eventos DML, DDL o logon hacen que se lleven a cabo las acciones del desencadenador. Las acciones del desencadenador especificadas en las instrucciones Transact-SQL surten efecto cuando se intenta la operacin. Los desencadenadores pueden incluir cualquier nmero y clase de instrucciones Transact-SQL, con excepciones. Para obtener ms informacin, vea la seccin Notas. Un desencadenador est diseado para comprobar o cambiar los datos en base a una instruccin de modificacin o definicin de datos; no debe devolver datos al usuario. Las instrucciones Transact-SQL de un desencadenador incluyen a menudo lenguaje de control de flujo. Los desencadenadores DML usan las tablas lgicas (conceptuales) deleted e inserted. Son de estructura similar a la tabla en que se define el desencadenador, es decir, la tabla en que se intenta la accin del usuario. Las tablas deleted e inserted guardan los valores antiguos o nuevos de las filas que la accin del usuario puede cambiar. Por ejemplo, para recuperar todos los valores de la tabla deleted, utilice:

Copiar SELECT * FROM deleted


Para obtener ms informacin, vea Usar las tablas inserted y deleted. Los desencadenadores DDL y logon capturan informacin acerca del evento desencadenador mediante el uso de la funcin EVENTDATA (Transact-SQL). Para obtener ms informacin, vea Usar la funcin EVENTDATA. En un desencadenador DELETE, INSERT o UPDATE, SQL Server no admite referencias de columnas text, ntext o image en las tablas inserted y deleted si el nivel de compatibilidad es igual a 70. No se puede tener acceso a los valores text, image y ntext de las tablas inserted y deleted. Para recuperar el nuevo valor de un desencadenador INSERT o UPDATE, combine la tabla inserted con la tabla de actualizacin original. Cuando el nivel de compatibilidad es 65 o inferior, se devuelven valores NULL para las columnas inserted o deleted text, ntext o

image que admiten valores NULL; si las columnas no permiten valores NULL, se devuelven cadenas de longitud cero. Si el nivel de compatibilidad es 80 o superior, SQL Server permite actualizar las columnas text, ntext o image mediante el desencadenador INSTEAD OF en tablas o vistas.

Importante:
Los tipos de datos ntext, text e image se quitarn en una versin futura de Microsoft SQL Server. Evite su uso en nuevos trabajos de desarrollo y piense en modificar las aplicaciones que los usan actualmente. Utilice nvarchar(max), varchar(max) y varbinary(max) en su lugar. Tanto los desencadenadores AFTER como INSTEAD OF admiten los datos varchar(MAX), nvarchar(MAX) y varbinary(MAX) en las tablas inserted y deleted. < method_specifier > En el caso de un desencadenador CLR, especifica el mtodo de enlace de un ensamblado con el desencadenador. El mtodo no puede utilizar argumentos y debe devolver void. class_name debe ser un identificador de SQL Server vlido y debe existir como una clase en el ensamblado con visibilidad de ensamblado. Si la clase tiene un nombre calificado como espacio de nombres que utiliza '.' para separar las partes del espacio de nombres, el nombre de la clase debe estar delimitado por delimitadores de tipo [ ] o " ". La clase no puede ser anidada.

Nota:
De manera predeterminada, la capacidad de SQL Server de ejecutar cdigo CLR est desactivada. Se puede crear, modificar y quitar objetos de bases de datos que hagan referencia a mdulos de cdigo administrados, pero estas referencias no se ejecutarn en una instancia de SQL Server a menos que la opcin clr enabled est habilitada mediante el uso de sp_configure.

Notas
Desencadenadores DML
Los desencadenadores DML se utilizan frecuentemente para imponer las reglas empresariales y la integridad de los datos. SQL Server proporciona integridad referencial declarativa (DRI) mediante las instrucciones ALTER TABLE y CREATE TABLE. Sin embargo, DRI no proporciona integridad referencial entre bases de datos. La integridad referencial se refiere a las reglas acerca de la relacin entre la clave principal y la clave externa de las tablas. Para exigir la integridad referencial, utilice las restricciones de tipo PRIMARY KEY y FOREIGN KEY en ALTER TABLE y CREATE TABLE. Si existen restricciones en la tabla de desencadenadores, se comprueban despus de la ejecucin del desencadenador INSTEAD OF y antes de la de AFTER. Si se infringen las restricciones, se revierten las acciones del desencadenador INSTEAD OF y el desencadenador AFTER no se ejecuta. El primer y ltimo desencadenador AFTER que se ejecuta en una tabla se puede especificar mediante sp_settriggerorder. Slo se puede especificar el primer y ltimo desencadenador AFTER para cada una de las operaciones INSERT, UPDATE y DELETE de una tabla. Si hay otros desencadenadores AFTER en la misma tabla, se ejecutan aleatoriamente. Si una instruccin ALTER TRIGGER modifica el primer o ltimo desencadenador, se elimina el primer o ltimo atributo establecido en el desencadenador modificado, y el valor del orden se debe restablecer mediante sp_settriggerorder. Un desencadenador AFTER se ejecuta slo despus de ejecutar correctamente la instruccin SQL desencadenadora. La ejecucin correcta incluye todas las acciones referenciales en cascada y las comprobaciones de restricciones asociadas con el objeto actualizado o eliminado. Si un desencadenador INSTEAD OF definido en una tabla ejecuta una instruccin en la tabla que normalmente volvera a activarlo, al desencadenador no se lo llama de forma recursiva. En su lugar, la instruccin se procesa como si la tabla no tuviera un desencadenador INSTEAD OF e inicia la cadena de operaciones de restriccin y ejecuciones de desencadenadores AFTER. Por ejemplo, si para una tabla se define un desencadenador como INSTEAD OF INSERT, y ste ejecuta una instruccin INSERT en la misma tabla, la instruccin INSERT ejecutada por el desencadenador INSTEAD OF no vuelve a llamar al

desencadenador. La instruccin INSERT ejecutada por el desencadenador inicia el proceso que realiza las acciones de restriccin y activa cualquier desencadenador AFTER INSERT definido para la tabla. Si un desencadenador INSTEAD OF definido en una vista ejecuta una instruccin en la vista que normalmente volvera a activarlo, no se llamar el desencadenador de forma recursiva. En su lugar, la instruccin se resuelve a modo de modificaciones en las tablas base subyacentes de la vista. En este caso, la definicin de la vista debe cumplir todas las restricciones para una vista actualizable. Para obtener una definicin de vistas actualizables, vea Modificar datos mediante una vista. Por ejemplo, si para una tabla se define un desencadenador como INSTEAD OF UPDATE y ste ejecuta una instruccin UPDATE que hace referencia a la misma vista, la instruccin UPDATE, que ejecuta el desencadenador INSTEAD OF, no vuelve a llamar al desencadenador. La instruccin UPDATE que ejecuta el desencadenador se procesa en la vista, como si sta no tuviera un desencadenador INSTEAD OF. Las columnas que modifica la instruccin UPDATE deben resolverse en una nica tabla base. Cada vez que se modifica una tabla base subyacente se inicia la cadena para aplicar restricciones y activar los desencadenadores AFTER definidos para la tabla. Probar las acciones de UPDATE o INSERT en columnas especficas Se puede disear un desencadenador Transact-SQL que realice determinadas acciones segn modificaciones de UPDATE o INSERT en columnas especficas. Para ello, utilice UPDATE() o COLUMNS_UPDATED en el cuerpo del desencadenador. UPDATE() comprueba los intentos de UPDATE o INSERT en una columna. COLUMNS_UPDATED comprueba las acciones de UPDATE o INSERT que se realizaron en varias columnas y devuelve un patrn de bits que indica las columnas que fueron insertadas o actualizadas. Limitaciones de los desencadenadores CREATE TRIGGER debe ser la primera instruccin en el proceso por lotes y slo se puede aplicar a una tabla. Un desencadenador se crea solamente en la base de datos actual; sin embargo, un desencadenador puede hacer referencia a objetos que estn fuera de la base de datos actual. Si se especifica el nombre del esquema del desencadenador (para calificar el desencadenador), califique el nombre de la tabla de la misma forma. La misma accin del desencadenador puede definirse para ms de una accin del usuario (por ejemplo, INSERT y UPDATE) en la misma instruccin CREATE TRIGGER. Los desencadenadores INSTEAD OF DELETE/UPDATE no pueden definirse en una tabla con una clave externa definida en cascada en la accin DELETE/UPDATE. En un desencadenador se puede especificar cualquier instruccin SET. La opcin SET seleccionada permanece en efecto durante la ejecucin del desencadenador y, despus, vuelve a su configuracin anterior. Cuando se activa un desencadenador, los resultados se devuelven a la aplicacin que llama, exactamente igual que con los procedimientos almacenados. Para impedir que se devuelvan resultados a la aplicacin debido a la activacin de un desencadenador, no incluya las instrucciones SELECT que devuelven resultados ni las instrucciones que realizan una asignacin variable en un desencadenador. Un desencadenador que incluya instrucciones SELECT que devuelven resultados al usuario o instrucciones que realizan asignaciones de variables requiere un tratamiento especial; estos resultados devueltos tendran que escribirse en cada aplicacin en la que se permiten modificaciones a la tabla del desencadenador. Si es preciso que existan asignaciones de variable en un desencadenador, utilice una instruccin SET NOCOUNT al principio del mismo para impedir la devolucin de cualquier conjunto de resultados. Aunque una instruccin TRUNCATE TABLE es en realidad un desencadenador DELETE, no puede activar un desencadenador porque la operacin no registra las eliminaciones de fila individuales. Sin embargo, slo aqullos con permisos en una tabla para ejecutar una instruccin TRUNCATE TABLE deben preocuparse sobre el modo de invocar inadvertidamente un desencadenador DELETE con una instruccin TRUNCATE TABLE. La instruccin WRITETEXT, ya se registre o no, no activa un desencadenador. Las siguientes instrucciones Transact-SQL no estn permitidas en un desencadenador DML:

ALTER DATABASE LOAD DATABASE RESTORE DATABASE

CREATE DATABASE LOAD LOG RESTORE LOG

DROP DATABASE RECONFIGURE

Adems, las siguientes instrucciones Transact-SQL no se permiten en el cuerpo de un desencadenador DML cuando ste se utiliza en la tabla o vista que es objeto de la accin desencadenadora.

Importante:
Aunque esta restriccin se ha introducido en SQL Server 2005, se exige tambin cuando el modo de compatibilidad con versiones anteriores se establece en 80. CREATE INDEX DBCC DBREINDEX ALTER TABLE cuando se utiliza para hacer lo siguiente: Agregar, modificar o quitar columnas. Cambiar particiones. Agregar o quitar restricciones de tipo PRIMARY KEY o UNIQUE. ALTER INDEX ALTER PARTITION FUNCTION DROP INDEX DROP TABLE

y y y

Nota:
Ya que SQL Server no admite desencadenadores definidos por el usuario en tablas del sistema, se recomienda no crearlos.

Desencadenadores DDL
Los desencadenadores DDL, al igual que los estndar, ejecutan procedimientos almacenados como respuesta a un evento. Pero a diferencia de los desencadenadores estndar, no se ejecutan como respuesta a instrucciones UPDATE, INSERT o DELETE en una tabla o vista. En cambio, se ejecutan principalmente como respuesta a instrucciones de lenguaje de definicin de datos (o DDL). Entre ellas se incluyen instrucciones CREATE, ALTER, DROP, GRANT, DENY, REVOKE y UPDATE STATISTICS. Algunos procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL tambin pueden activar desencadenadores DDL.

Importante:
Pruebe los desencadenadores DDL para determinar sus respuestas a la ejecucin de los procedimientos almacenados del sistema. Por ejemplo, la instruccin CREATE TYPE y el procedimiento almacenado sp_addtype activarn un desencadenador DDL que se crea en un evento CREATE_TYPE. Sin embargo, el procedimiento almacenado sp_rename no activa ningn desencadenador DDL.

Para obtener ms informacin acerca de los desencadenadores DDL, vea Desencadenadores DDL. Los desencadenadores DDL no se activan como respuesta a eventos que afectan a procedimientos almacenados y tablas temporales, ya sean locales o globales. A diferencia de los desencadenadores DML, los desencadenadores DDL no tienen como mbito los esquemas. Por tanto, OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY y OBJECTPROPERTYEX no se pueden utilizar para efectuar consultas en metadatos sobre desencadenadores DDL. Utilice en su lugar las vistas de catlogo. Para obtener ms informacin, vea Obtener informacin acerca de los desencadenadores DDL.

Nota:
Los desencadenadores DDL con mbito en el servidor aparecen en el Explorador de objetos de SQL Server Management Studio, en la carpeta Triggers. Dicha carpeta se encuentra en la carpeta Server Objects. Los desencadenadores DDL con mbito en la base de datos aparecen en la carpeta Database Triggers. Esta carpeta se encuentra en la carpeta Programacin de la base de datos correspondiente.

Desencadenadores logon
Los desencadenadores logon se activan en respuesta al evento LOGON. Este evento se genera cuando se est estableciendo la sesin de un usuario. Para obtener ms informacin, vea Desencadenadores logon.

Consideraciones generales sobre los desencadenadores


Devolver resultados Se quitar la capacidad de devolver resultados desde los desencadenadores en una futura versin de SQL Server. Los desencadenadores que devuelven conjuntos de resultados pueden provocar comportamientos inesperados en aplicaciones que no estn diseadas para trabajar con ellos. Evite la devolucin de conjuntos de resultados desde desencadenadores en los nuevos trabajos de desarrollo y piense en modificar las aplicaciones que la usan actualmente. Para evitar que los desencadenadores devuelvan conjuntos de resultados en SQL Server 2005, establezca la opcin disallow results from triggers en 1. Los desencadenadores LOGON impiden que se devuelvan conjuntos de resultados y este comportamiento no se puede configurar. Si un desencadenador LOGON genera un conjunto de resultados, no puede ejecutarse y el intento de iniciar sesin que activ el desencadenador se rechaza. Desencadenadores mltiples SQL Server permite que se creen varios desencadenadores para cada evento DML, DDL o LOGON. Por ejemplo, si se ejecuta CREATE TRIGGER FOR UPDATE para una tabla que ya tiene un desencadenador UPDATE, se crear un desencadenador de actualizacin adicional. En las versiones anteriores de SQL Server, slo se permita un desencadenador por cada evento de modificacin (INSERT, UPDATE, DELETE) en cada tabla.

Nota:
Con un nivel de compatibilidad de 70, el comportamiento predeterminado de CREATE TRIGGER es agregar desencadenadores adicionales a los ya existentes si los nombres de desencadenadores son distintos. Si el nombre de los desencadenadores es el mismo, SQL Server devuelve un mensaje de error. Sin embargo, si el nivel de compatibilidad es igual o menor que 65, cualquier desencadenador creado con la instruccin CREATE TRIGGER substituir a los desencadenadores existentes del mismo tipo, incluso si los nombres de los desencadenadores son distintos. Para obtener ms informacin, vea sp_dbcmptlevel (Transact-SQL).

Desencadenadores recursivos SQL Server permite tambin la invocacin recursiva de desencadenadores cuando el valor RECURSIVE_TRIGGERS est habilitado mediante ALTER DATABASE. Los desencadenadores recursivos permiten dos tipos de repeticin:

Repeticin indirecta Con la repeticin indirecta, una aplicacin actualiza la tabla T1. As se activa el desencadenador TR1 para actualizar la tabla T2. En esta situacin, el desencadenador T2 activa y actualiza la tabla T1.

Repeticin directa Con la repeticin directa, una aplicacin actualiza la tabla T1. As se activa el desencadenador TR1 para actualizar la tabla T1. Debido a que la tabla T1 se ha actualizado, el desencadenador TR1 se activa de nuevo, y as sucesivamente.

Este ejemplo utiliza ambas repeticiones de desencadenador, directa e indirecta. Suponga que en la tabla T1 se han definido dos desencadenadores de actualizacin, TR1 y TR2. El desencadenador TR1 actualiza la tabla T1 recursivamente. Una instruccin UPDATE ejecuta cada TR1 y TR2 una vez. Adems, la ejecucin de TR1 desencadena la ejecucin de TR1 (recursivamente) y TR2. Las tablas inserted y deleted de un desencadenador especfico contienen filas que corresponden slo a la instruccin UPDATE que invoc al desencadenador.

Nota:
El comportamiento anterior slo se produce si el valor RECURSIVE_TRIGGERS est habilitado mediante ALTER DATABASE. No hay un orden definido en el que se ejecuten los distintos desencadenadores definidos de un evento especfico. Cada desencadenador debe ser independiente.

Deshabilitar RECURSIVE_TRIGGERS slo evita las repeticiones directas. Para deshabilitar la repeticin indirecta, establezca la opcin nested triggers del servidor en 0 con sp_configure. Si alguno de los desencadenadores ejecuta una instruccin ROLLBACK TRANSACTION, no se ejecuta ningn desencadenador posterior, independientemente del nivel de anidamiento. Desencadenadores anidados Los desencadenadores pueden anidarse hasta un mximo de 32 niveles. Si un desencadenador cambia una tabla en la que hay otro desencadenador, el segundo se activa y puede, entonces, llamar a un tercero, y as sucesivamente. Si algn desencadenador de la cadena causa un bucle infinito, el nivel de anidamiento se habr sobrepasado, con lo que se cancela el desencadenador. Para deshabilitar los desencadenadores anidados, establezca la opcin nested triggers de sp_configure en 0 (desactivada). La configuracin predeterminada permite desencadenadores anidados. Si los desencadenadores anidados estn desactivados, los desencadenadores recursivos tambin se deshabilitan, independientemente del valor de RECURSIVE_TRIGGERS establecido mediante ALTER DATABASE.

Nota:
Cuando un desencadenador Transact-SQL ejecuta cdigo administrado haciendo referencia a una rutina, un tipo o agregado CLR, esta referencia cuenta como un nivel para el lmite de anidamiento de 32 niveles. Los mtodos invocados desde el cdigo administrado no cuentan para este lmite.

Resolucin diferida de nombres SQL Server permite que los procedimientos almacenados, desencadenadores y procesos por lotes de Transact-SQL hagan referencia a tablas que no existen en el momento de la compilacin. Esta capacidad se denomina resolucin diferida de nombres. Sin embargo, si los procedimientos almacenados, desencadenadores y procesos por lotes de Transact-SQL hacen referencia a una tabla definida en el procedimiento almacenado o desencadenador, se emitir una advertencia en el momento de la creacin slo si el valor de nivel de compatibilidad se establece en 65. En tiempo de compilacin se emite una advertencia si se utiliza un lote. Si la tabla a la que se hace referencia no existe, se devuelve un mensaje de error en tiempo de ejecucin. Para obtener ms informacin, vea Resolucin diferida de nombres y compilacin.

Permisos
Para crear un desencadenador DML, es necesario contar con permiso ALTER sobre la tabla o vista en la que se crea el desencadenador.

Para crear un desencadenador DDL con mbito de servidor (ON ALL SERVER) o un desencadenador logon se requiere el permiso CONTROL SERVER en el servidor. Para crear un desencadenador DDL con mbito en la base de datos (ON DATABASE) es necesario un permiso ALTER ANY DATABASE DDL TRIGGER en la base de datos actual.

Ejemplos
A. Utilizar un desencadenador DML con un mensaje de aviso
El siguiente desencadenador DML imprime un mensaje en el cliente cuando alguien intenta agregar o cambiar datos en la tabla Customer.

Copiar USE AdventureWorks; GO IF OBJECT_ID ('Sales.reminder1', 'TR') IS NOT NULL DROP TRIGGER Sales.reminder1; GO CREATE TRIGGER reminder1 ON Sales.Customer AFTER INSERT, UPDATE AS RAISERROR ('Notify Customer Relations', 16, 10); GO

B. Utilizar un desencadenador DML con un mensaje de correo electrnico de aviso


Este ejemplo enva un mensaje de correo electrnico a una persona especificada (MaryM) cuando cambia la tabla Customer.

Copiar USE AdventureWorks; GO IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL DROP TRIGGER Sales.reminder2; GO CREATE TRIGGER reminder2 ON Sales.Customer AFTER INSERT, UPDATE, DELETE AS EXEC msdb.dbo.sp_send_dbmail @profile_name = 'AdventureWorks Administrator', @recipients = 'danw@Adventure-Works.com', @body = 'Don''t forget to print a report for the sales force.', @subject = 'Reminder'; GO

C. Utilizar un desencadenador DML AFTER para exigir una regla de empresa entre las tablas PurchaseOrderHeader y Vendor
Debido a que las restricciones CHECK slo pueden hacer referencia a las columnas en que se han definido las restricciones de columna o de tabla, cualquier restriccin de referencias cruzadas, en este caso, reglas de empresa, debe definirse como desencadenadores. En este ejemplo se crea un desencadenador DML. El desencadenador comprueba que la solvencia del proveedor es satisfactoria cuando se intenta insertar un nuevo pedido de compra en la tabla PurchaseOrderHeader. Para obtener la solvencia del proveedor, debe hacerse referencia a la tabla Vendor. Si la solvencia no es satisfactoria, se obtiene un mensaje y no se ejecuta la insercin.

Nota:
Para ver ejemplos de desencadenadores DML AFTER que actualizan varias filas, vea Consideraciones acerca de operaciones con varias filas para desencadenadores DML . Para ver ejemplos de desencadenadores DML INSTEAD OF INSERT, vea Desencadenadores INSTEAD OF INSERT.

Copiar IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL DROP TRIGGER Purchasing.LowCredit; GO CREATE TRIGGER LowCredit ON Purchasing.PurchaseOrderHeader AFTER INSERT AS DECLARE @creditrating tinyint, @vendorid int SELECT @creditrating = v.CreditRating, @vendorid = p.VendorID FROM Purchasing.PurchaseOrderHeader AS p INNER JOIN inserted AS i ON p.PurchaseOrderID = i.PurchaseOrderID JOIN Purchasing.Vendor AS v on v.VendorID = i.VendorID IF @creditrating = 5 BEGIN RAISERROR ('This vendor''s credit rating is too low to accept new purchase orders.', 16, 1) ROLLBACK TRANSACTION END GO

D. Utilizar la resolucin diferida de nombres


El ejemplo siguiente crea dos desencadenadores DML para ilustrar la resolucin diferida de nombres.

Copiar USE AdventureWorks; GO IF OBJECT_ID ('HumanResources.trig1','TR') IS NOT NULL DROP TRIGGER HumanResources.trig1; GO -- Creating a trigger on a nonexistent table. CREATE TRIGGER HumanResources.trig1 on HumanResources.Employee AFTER INSERT, UPDATE, DELETE AS SELECT e.EmployeeID, e.BirthDate, x.info FROM HumanResources.Employee AS e INNER JOIN does_not_exist AS x ON e.EmployeeID = x.xID GO -- Here is the statement to actually see the text of the trigger. SELECT t.object_id, m.definition FROM sys.triggers AS t INNER JOIN sys.sql_modules AS m ON t.object_id = m.object_id WHERE t.type = 'TR' and t.name = 'trig1' AND t.parent_class = 1 GO -- Creating a trigger on an existing table, but with a nonexistent -- column. USE AdventureWorks; GO IF OBJECT_ID ('HumanResources.trig2','TR') IS NOT NULL DROP TRIGGER HumanResources.trig2 GO CREATE TRIGGER HumanResources.trig2

ON HumanResources.Employee AFTER INSERT, UPDATE AS DECLARE @fax varchar(12) SELECT @fax = 'AltPhone' FROM HumanResources.Employee GO -- Here is the statement to actually see the text of the trigger. SELECT t.object_id, m.definition FROM sys.triggers AS t INNER JOIN sys.sql_modules AS m ON t.object_id = m.object_id WHERE t.type = 'TR' and t.name = 'trig2' AND t.parent_class = 1 GO

E. Utilizar un desencadenador DDL con mbito en la base de datos


En el ejemplo siguiente se utiliza un desencadenador DDL para impedir que se quiten sinnimos en una base de datos.

Copiar USE AdventureWorks; GO IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'safety') DROP TRIGGER safety ON DATABASE; GO CREATE TRIGGER safety ON DATABASE FOR DROP_SYNONYM AS RAISERROR ('You must disable Trigger "safety" to drop synonyms!',10, 1) ROLLBACK GO DROP TRIGGER safety ON DATABASE; GO

E. Utilizar un desencadenador DDL con mbito en el servidor


En el ejemplo siguiente se utiliza un desencadenador DDL para imprimir un mensaje si se produce un evento CREATE DATABASE en la instancia actual del servidor, y se utiliza la funcin EVENTDATA para recuperar el texto de la instruccin Transact-SQL correspondiente.

Nota:
Para obtener ms ejemplos que usan EVENTDATA en desencadenadores DDL, vea Usar la funcin EVENTDATA.

Copiar IF EXISTS (SELECT * FROM sys.server_triggers WHERE name = 'ddl_trig_database') DROP TRIGGER ddl_trig_database ON ALL SERVER; GO CREATE TRIGGER ddl_trig_database ON ALL SERVER FOR CREATE_DATABASE AS PRINT 'Database Created.' SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')

GO DROP TRIGGER ddl_trig_database ON ALL SERVER; GO

G. Usar un desencadenador logon


El ejemplo siguiente de desencadenador logon rechaza un intento de iniciar sesin en SQL Server como miembro del inicio de sesin login_test si ya hay tres sesiones de usuario ejecutndose con ese inicio de sesin.

Copiar USE master; GO CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE, CHECK_EXPIRATION = ON; GO GRANT VIEW SERVER STATE TO login_test; GO CREATE TRIGGER connection_limit_trigger ON ALL SERVER WITH EXECUTE AS 'login_test' FOR LOGON AS BEGIN IF ORIGINAL_LOGIN()= 'login_test' AND (SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1 AND original_login_name = 'login_test') > 3 ROLLBACK; END;

H. Ver los eventos que hacen que se active un desencadenador


En el ejemplo siguiente se efecta una consulta en las vistas de catlogo sys.triggers y sys.trigger_events para determinar qu eventos de lenguaje Transact-SQL hacen que se active el desencadenador safety. safety se ha creado en un ejemplo anterior.

Copiar SELECT TE.* FROM sys.trigger_events AS TE JOIN sys.triggers AS T ON T.object_id = TE.object_id WHERE T.parent_class = 0 AND T.name = 'safety' GO

Vous aimerez peut-être aussi