Está en la página 1de 17

10/10/2016

CREATETRIGGER(TransactSQL)

CREATE TRIGGER TransactSQL

**ESTETEMASEAPLICAA:**![](../Image/Applies%20to/yes.png)SQLServer\(apartirde2008\)!
[](../Image/Applies%20to/yes.png)BasededatosSQLdeAzure![](../Image/Applies%20to/no.png)Al
macenamientodedatosSQLdeAzure![](../Image/Applies%20to/no.png)Almacenamientodedatospar
alelos

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. Estos desencadenadores se activan cuando se
desencadena cualquier evento vlido, con independencia de que las filas de la tabla se vean o no afectadas. Para obtener ms
informacin, consulte Desencadenadores DML https://msdn.microsoft.com/esco/library/ms178110.aspx.
Los desencadenadores DDL se ejecutan como respuesta a diversos eventos del lenguaje de definicin de datos DDL. Estos
eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de TransactSQL, 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 pueden crearse directamente a partir
de instrucciones de TransactSQL o de mtodos de ensamblados creados en Common Language Runtime CLR de
Microsoft.NET Framework y cargados en una instancia de SQL Server. SQL Server permite crear varios desencadenadores para
cualquier instruccin especfica.

Importante

El cdigo malintencionado de los desencadenadores se puede ejecutar con privilegios concentrados. Para obtener ms
informacin acerca de cmo mitigar esta amenaza, vea Administrar la seguridad de los desencadenadores
https://msdn.microsoft.com/esco/library/ms191134.aspx.

Se aplica a: de SQL Server SQL Server 2008 a la versin actual https://msdn.microsoft.com/library/bb500435.aspx, Base de
datos SQL de Azure.
Convenciones de sintaxis de TransactSQL https://msdn.microsoft.com/esco/library/ms177563.aspx

Sintaxis
https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

1/17

10/10/2016

CREATETRIGGER(TransactSQL)

SQLServerSyntax
TriggeronanINSERT,UPDATE,orDELETEstatementtoatableorview(DMLTrigger)

CREATETRIGGER[schema_name.]trigger_name
ON{table|view}
[WITH<dml_trigger_option>[,...n]]
{FOR|AFTER|INSTEADOF}
{[INSERT][,][UPDATE][,][DELETE]}
[WITHAPPEND]
[NOTFORREPLICATION]
AS{sql_statement[;][,...n]|EXTERNALNAME<methodspecifier[;]>}

<dml_trigger_option>::=
[ENCRYPTION]
[EXECUTEASClause]

<method_specifier>::=
assembly_name.class_name.method_name

TriggeronaCREATE,ALTER,DROP,GRANT,DENY,REVOKE,orUPDATESTATISTICSstatement(DD
LTrigger)
CREATETRIGGERtrigger_name
ON{ALLSERVER|DATABASE}
[WITH<ddl_trigger_option>[,...n]]
{FOR|AFTER}{event_type|event_group}[,...n]
AS{sql_statement[;][,...n]|EXTERNALNAME<methodspecifier>[;]}

<ddl_trigger_option>::=
[ENCRYPTION]
[EXECUTEASClause]

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

2/17

10/10/2016

CREATETRIGGER(TransactSQL)

TriggeronaLOGONevent(LogonTrigger)

CREATETRIGGERtrigger_name
ONALLSERVER
[WITH<logon_trigger_option>[,...n]]
{FOR|AFTER}LOGON
AS{sql_statement[;][,...n]|EXTERNALNAME<methodspecifier>[;]}

<logon_trigger_option>::=
[ENCRYPTION]
[EXECUTEASClause]

Sintaxis

WindowsAzureSQLDatabaseSyntax
TriggeronanINSERT,UPDATE,orDELETEstatementtoatableorview(DMLTrigger)

CREATETRIGGER[schema_name.]trigger_name
ON{table|view}
[WITH<dml_trigger_option>[,...n]]
{FOR|AFTER|INSTEADOF}
{[INSERT][,][UPDATE][,][DELETE]}
AS{sql_statement[;][,...n][;]>}

<dml_trigger_option>::=
[EXECUTEASClause]

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

3/17

10/10/2016

CREATETRIGGER(TransactSQL)

WindowsAzureSQLDatabaseSyntax
TriggeronaCREATE,ALTER,DROP,GRANT,DENY,REVOKE,orUPDATESTATISTICSstatement(DDLTrig
ger)

CREATETRIGGERtrigger_name
ON{DATABASE}
[WITH<ddl_trigger_option>[,...n]]
{FOR|AFTER}{event_type|event_group}[,...n]
AS{sql_statement[;][,...n][;]}

<ddl_trigger_option>::=
[EXECUTEASClause]

Argumentos
schema_name
Es el nombre del esquema al que pertenece un desencadenador DML. Los desencadenadores DML tienen como mbito el
esquema de la tabla o la vista donde se crean. schema_name no se puede especificar para los desencadenadores DDL o LOGON.
trigger_name
Es el nombre del desencadenador. El parmetro trigger_name debe cumplir con las reglas de los identificadores
https://msdn.microsoft.com/esco/library/ms175874.aspx, 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. Solo 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

Se aplica a: SQL Server 2008 a SQL Server 2016.


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 el servidor actual.
WITH ENCRYPTION

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

4/17

10/10/2016

CREATETRIGGER(TransactSQL)

Se aplica a: SQL Server 2008 a SQL Server 2016.


Ofusca el texto de la instruccin CREATE TRIGGER. El uso de WITH ENCRYPTION impide que el desencadenador se publique
como parte de la replicacin 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, consulte EXECUTE AS clusula de TransactSQL https://msdn.microsoft.com/es
co/library/ms188354.aspx.
FOR | AFTER
AFTER especifica que el desencadenador DML solo 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 solo 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 permiten 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. Tampoco se permite la opcin UPDATE en tablas que tengan una
relacin referencial que especifique una accin ON UPDATE en cascada.
WITH APPEND

Se aplica a: SQL Server 2008 a SQL Server 2008 R2.


Especifica que debe agregarse un desencadenador adicional de un tipo existente. WITH APPEND no se puede utilizar con
desencadenadores INSTEAD OF o cuando se ha declarado AFTER explcitamente. WITH APPEND solo 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.
https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

5/17

10/10/2016

CREATETRIGGER(TransactSQL)

event_type
Es el nombre de un evento de lenguaje TransactSQL que, despus de su ejecucin, hace que se active un desencadenador DDL.
Los eventos vlidos para los desencadenadores DDL se enumeran en Eventos DDL https://msdn.microsoft.com/es
co/library/bb522542.aspx.
event_group
Es el nombre de un agrupamiento predefinido de eventos de lenguaje de TransactSQL. El desencadenador DDL se activa tras la
ejecucin de cualquier evento de lenguaje TransactSQL que pertenezca a event_group. Los grupos de eventos vlidos para los
desencadenadores DDL se enumeran en Grupos de eventos DDL https://msdn.microsoft.com/esco/library/bb510452.aspx.
Una vez que CREATE TRIGGER ha terminado de ejecutarse, event_group acta tambin como una macro agregando los tipos de
evento que abarca a la vista de catlogo sys.trigger_events.
NOT FOR REPLICATION

Se aplica a: SQL Server 2008 a SQL Server 2016.


Indica que el desencadenador no debe ejecutarse cuando un agente de replicacin modifica la tabla involucrada en el mismo.
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 TransactSQL surten efecto cuando se intenta la operacin.
Los desencadenadores pueden incluir cualquier nmero y clase de instrucciones TransactSQL, con excepciones. Para obtener
ms informacin, vea la seccin Comentarios. 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 TransactSQL de un
desencadenador incluyen a menudo lenguaje de control de flujo https://msdn.microsoft.com/esco/library/ms174290.aspx.
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:

SELECT*FROMdeleted;

Para obtener ms informacin, consulte Usar las tablas insertadas y eliminadas https://msdn.microsoft.com/es
co/library/ms191300.aspx.
Los desencadenadores DDL y logon capturan informacin acerca del evento desencadenador mediante el uso de la funcin
EVENTDATA TransactSQL https://msdn.microsoft.com/esco/library/ms173781.aspx. Para obtener ms informacin, consulte
Usar la funcin EVENTDATA https://msdn.microsoft.com/esco/library/ms187909.aspx.
SQL Server permite actualizar las columnas text, ntext o image mediante el uso del desencadenador INSTEAD OF en tablas o
vistas.

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

6/17

10/10/2016

CREATETRIGGER(TransactSQL)

Importante

Los tipos de datos ntext, text e image se quitarn en una versin futura de MicrosoftSQL Server. Evite su uso en nuevos
trabajos de desarrollo y piense en modificar las aplicaciones que los usan actualmente. Utilice nvarcharmax
https://msdn.microsoft.com/esco/library/ms186939.aspx, varcharmax https://msdn.microsoft.com/es
co/library/ms176089.aspx y varbinarymax https://msdn.microsoft.com/esco/library/ms188362.aspx en su lugar. Tanto los
desencadenadores AFTER como INSTEAD OF admiten los datos varcharMAX, nvarcharMAX y varbinaryMAX en las
tablas inserted y deleted.
< method_specifier >

Se aplica a: SQL Server 2008 a SQL Server 2016.


En el caso de un desencadenador CLR, especifica el mtodo de enlace de un ensamblado con el desencadenador. El mtodo no
debe tomar argumentos y debe devolver void. class_name debe ser un identificador vlido de SQL Server y debe existir como
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 https://msdn.microsoft.com/es
co/library/ms175193.aspx est habilitada mediante el uso de sp_configure https://msdn.microsoft.com/es
co/library/ms188787.aspx.

Comentarios
Desencadenadores DML
Los desencadenadores DML se usan con frecuencia para aplicar las reglas de negocios y la integridad de 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.

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

7/17

10/10/2016

CREATETRIGGER(TransactSQL)

El primer y ltimo desencadenador AFTER que se ejecuta en una tabla se puede especificar mediante el uso de
sp_settriggerorder. Solo 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 quita el primer o ltimo atributo establecido
en el desencadenador modificado, y el valor del orden se debe restablecer mediante el uso de sp_settriggerorder.
Un desencadenador AFTER se ejecuta solo despus de ejecutar correctamente la instruccin SQL desencadenadora. La ejecucin
correcta incluye todas las acciones referenciales en cascada y las comprobaciones de restricciones asociadas al objeto
actualizado o eliminado. Un desencadenador AFTER no activar de forma recursiva un desencadenador INSTEAD OF en la misma
tabla.
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
https://msdn.microsoft.com/esco/library/ms180800.aspx.
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 TransactSQL que realice determinadas acciones segn modificaciones de UPDATE o
INSERT en columnas especficas. Para ello, utilice UPDATE https://msdn.microsoft.com/esco/library/ms187326.aspx o
COLUMNS_UPDATED https://msdn.microsoft.com/esco/library/ms186329.aspx 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 solo 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.
https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

8/17

10/10/2016

CREATETRIGGER(TransactSQL)

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.
Una instruccin TRUNCATE TABLE es de hecho una instruccin DELETE, pero no activa un desencadenador porque la operacin
no registra eliminaciones de filas individuales. Sin embargo, solo los usuarios con permisos para ejecutar una instruccin
TRUNCATE TABLE tienen que ocuparse de cmo sortear un desencadenador de DELETE de esta manera.
La instruccin WRITETEXT, ya se registre o no, no activa un desencadenador.
Las siguientes instrucciones TransactSQL no estn permitidas en un desencadenador DML:

ALTER DATABASE

CREATE DATABASE

DROP DATABASE

RESTORE DATABASE

RESTORE LOG

RECONFIGURE

Adems, las siguientes instrucciones de TransactSQL no se permiten en el cuerpo de un desencadenador DML cuando este se
usa en la tabla o la vista que es objeto de la accin desencadenadora.

CREATE INDEX incluidos CREATE SPATIAL INDEX y CREATE XML INDEX

ALTER INDEX

DROP INDEX

DBCC DBREINDEX

ALTER PARTITION FUNCTION

DROP TABLE

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.

Nota

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

Desencadenadores DDL
https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

9/17

10/10/2016

CREATETRIGGER(TransactSQL)

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 los procedimientos almacenados sp_addtype y sp_rename activarn un
desencadenador DDL creado en un evento CREATE_TYPE.
Para obtener ms informacin acerca de los desencadenadores DDL, vea Desencadenadores DDL
https://msdn.microsoft.com/esco/library/ms175941.aspx.
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, las
funciones como OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY y OBJECTPROPERTYEX no se pueden usar para efectuar consultas
en metadatos sobre desencadenadores DDL. Utilice en su lugar las vistas de catlogo. Para obtener ms informacin, consulte
Obtener informacin acerca de los desencadenadores DDL https://msdn.microsoft.com/esco/library/ms184304.aspx.

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 activan procedimientos almacenados en respuesta a un evento LOGON. Este evento se genera
cuando se establece una sesin de usuario con una instancia de SQL Server. Los desencadenadores logon se activan despus de
que termine la fase de autenticacin del inicio de sesin, pero antes de que se establezca la sesin de usuario realmente. Por
tanto, todos los mensajes que se originan dentro del desencadenador y que normalmente llegaran hasta el usuario, como los
mensajes de error y los mensajes de la instruccin PRINT, se desvan al registro de errores de SQL Server. Para obtener ms
informacin, vea Desencadenadores logon https://msdn.microsoft.com/esco/library/bb326598.aspx.
Los desencadenadores logon no se activan si se produce un error en la autenticacin.
Los desencadenadores logon no admiten las transacciones distribuidas. Se devuelve el error 3969 cuando se activa un
desencadenador logon que contiene una transaccin distribuida.

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

10/17

10/10/2016

CREATETRIGGER(TransactSQL)

Deshabilitar un desencadenador logon


Un desencadenador logon puede impedir la conexin al Motor de base de datos de todos los usuarios, incluidos los miembros
del rol fijo de servidor sysadmin. Cuando el desencadenador logon impide que se realicen las conexiones, los miembros del rol
fijo de servidor sysadmin pueden conectarse mediante la conexin de administrador dedicada o iniciando el Motor de base de
datos en modo de configuracin mnima f. Para obtener ms informacin, consulte Opciones de inicio del servicio de motor
de base de datos https://msdn.microsoft.com/esco/library/ms190737.aspx.

Consideraciones generales sobre los desencadenadores


Devolver resultados
En una versin futura de SQL, se quitar la capacidad de devolver resultados desde los desencadenadores. Los
desencadenadores que devuelven conjuntos de resultados pueden provocar un comportamiento inesperado en aplicaciones que
no estn diseadas para utilizarlos. 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, establezca la opcin No permitir resultados de desencadenadores
https://msdn.microsoft.com/esco/library/ms186337.aspx 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 se puede ejecutar y se rechazar el intento de
iniciar sesin activado por el desencadenador.

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, solo se permita un desencadenador por cada evento de
modificacin INSERT, UPDATE, DELETE en cada tabla.

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:
Recursin indirecta
Con la recursin 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.
Recursin directa
Con la recursin directa, la 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.
En el ejemplo siguiente se usa la recursin de desencadenadores 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 desencadenador 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 solo a
la instruccin UPDATE que invoc al desencadenador.

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

11/17

10/10/2016

CREATETRIGGER(TransactSQL)

Nota

El comportamiento anterior solo 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 solo evita las recursiones directas. Para deshabilitar tambin la recursin indirecta, establezca
la opcin del servidor nested triggers en 0 mediante 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 superado, con lo que se cancela el desencadenador.
Cuando un desencadenador TransactSQL 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 que se invocan desde el
cdigo administrado no cuentan para este lmite.
Para deshabilitar los desencadenadores anidados, establezca la opcin nested triggers de sp_configure en 0 desactivada. La
configuracin predeterminada permite desencadenadores anidados. Si la opcin nested triggers est desactivada, la opcin
recursive triggers tambin estar deshabilitada, independientemente del valor de RECURSIVE_TRIGGERS establecido mediante
ALTER DATABASE.
El primer desencadenador AFTER anidado que est dentro de un desencadenador INSTEAD OF se activar si la opcin de
configuracin del servidor nested triggers est establecida en 0. Sin embargo, con esta configuracin, no se activarn
posteriormente los desencadenadores AFTER. Es recomendable que revise sus aplicaciones en busca de desencadenadores
anidados para determinar si las aplicaciones cumplen con sus reglas de negocios en relacin con este comportamiento nuevo,
siempre que la opcin de configuracin del servidor nested triggers est establecida en 0 y, a continuacin, realice las
modificaciones apropiadas.

Resolucin diferida de nombres


SQL Server permite que los procedimientos almacenados, los desencadenadores y los procesos por lotes de TransactSQL hagan
referencia a tablas que no existen en tiempo de compilacin. Esta capacidad se denomina resolucin diferida de nombres.

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
https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

12/17

10/10/2016

CREATETRIGGER(TransactSQL)

A.Usar 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 de la base de datos AdventureWorks2012.

IFOBJECT_ID('Sales.reminder1','TR')ISNOTNULL
DROPTRIGGERSales.reminder1;
GO
CREATETRIGGERreminder1
ONSales.Customer
AFTERINSERT,UPDATE
ASRAISERROR('NotifyCustomerRelations',16,10);
GO

B.Usar 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 .

IFOBJECT_ID('Sales.reminder2','TR')ISNOTNULL
DROPTRIGGERSales.reminder2;
GO
CREATETRIGGERreminder2
ONSales.Customer
AFTERINSERT,UPDATE,DELETE
AS
EXECmsdb.dbo.sp_send_dbmail
@profile_name='AdventureWorks2012Administrator',
@recipients='danw@AdventureWorks.com',
@body='Don''tforgettoprintareportforthesalesforce.',
@subject='Reminder';
GO

C.Usar un desencadenador DML AFTER para exigir una regla de negocios entre las tablas
PurchaseOrderHeader y Vendor
Debido a que las restricciones CHECK solo pueden hacer referencia a las columnas en las que se han definido las restricciones de
columna o de tabla, cualquier restriccin entre tablas, en este caso, reglas de negocios, debe definirse como desencadenadores.
En el ejemplo siguiente se crea un desencadenador DML en la base de datos AdventureWorks2012. 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.

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

13/17

10/10/2016

CREATETRIGGER(TransactSQL)

IFOBJECT_ID('Purchasing.LowCredit','TR')ISNOTNULL
DROPTRIGGERPurchasing.LowCredit;
GO
ThistriggerpreventsarowfrombeinginsertedinthePurchasing.PurchaseOrderHeadertable

whenthecreditratingofthespecifiedvendorissetto5(belowaverage).

CREATETRIGGERPurchasing.LowCreditONPurchasing.PurchaseOrderHeader
AFTERINSERT
AS
IFEXISTS(SELECT*
FROMPurchasing.PurchaseOrderHeaderASp
JOINinsertedASi
ONp.PurchaseOrderID=i.PurchaseOrderID
JOINPurchasing.VendorASv
ONv.BusinessEntityID=p.VendorID
WHEREv.CreditRating=5
)
BEGIN
RAISERROR('Avendor''screditratingistoolowtoacceptnew
purchaseorders.',16,1);
ROLLBACKTRANSACTION;
RETURN
END;
GO

ThisstatementattemptstoinsertarowintothePurchaseOrderHeadertable
foravendorthathasabelowaveragecreditrating.
TheAFTERINSERTtriggerisfiredandtheINSERTtransactionisrolledback.

INSERTINTOPurchasing.PurchaseOrderHeader(RevisionNumber,Status,EmployeeID,
VendorID,ShipMethodID,OrderDate,ShipDate,SubTotal,TaxAmt,Freight)
VALUES(
2
,3
,261
,1652
,4
,GETDATE()
,GETDATE()
,44594.55
,3567.564
,1114.8638);
GO

D.Usar un desencadenador DDL con mbito de base de datos


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

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

14/17

10/10/2016

CREATETRIGGER(TransactSQL)

IFEXISTS(SELECT*FROMsys.triggers
WHEREparent_class=0ANDname='safety')
DROPTRIGGERsafety
ONDATABASE;
GO
CREATETRIGGERsafety
ONDATABASE
FORDROP_SYNONYM
AS
RAISERROR('YoumustdisableTrigger"safety"todropsynonyms!',10,1)
ROLLBACK
GO
DROPTRIGGERsafety
ONDATABASE;
GO

E.Usar un desencadenador DDL con mbito de 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 TransactSQL
correspondiente. Para obtener ms ejemplos que usan EVENTDATA en desencadenadores DDL, vea Usar la funcin EVENTDATA
https://msdn.microsoft.com/esco/library/ms187909.aspx.

Se aplica a: SQL Server 2008 a SQL Server 2016.

IFEXISTS(SELECT*FROMsys.server_triggers
WHEREname='ddl_trig_database')
DROPTRIGGERddl_trig_database
ONALLSERVER;
GO
CREATETRIGGERddl_trig_database
ONALLSERVER
FORCREATE_DATABASE
AS
PRINT'DatabaseCreated.'
SELECTEVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO
DROPTRIGGERddl_trig_database
ONALLSERVER;
GO

F.Usar un desencadenador LOGON


https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

15/17

10/10/2016

CREATETRIGGER(TransactSQL)

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.

Se aplica a: SQL Server 2008 a SQL Server 2016.

USEmaster;
GO
CREATELOGINlogin_testWITHPASSWORD='3KHJ6dhx(0xVYsdf'MUST_CHANGE,
CHECK_EXPIRATION=ON;
GO
GRANTVIEWSERVERSTATETOlogin_test;
GO
CREATETRIGGERconnection_limit_trigger
ONALLSERVERWITHEXECUTEAS'login_test'
FORLOGON
AS
BEGIN
IFORIGINAL_LOGIN()='login_test'AND
(SELECTCOUNT(*)FROMsys.dm_exec_sessions
WHEREis_user_process=1AND
original_login_name='login_test')>3
ROLLBACK;
END;

G.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 TransactSQL hacen que se active el desencadenador safety . safety se ha creado en el ejemplo
anterior.

SELECTTE.*
FROMsys.trigger_eventsASTE
JOINsys.triggersASTONT.object_id=TE.object_id
WHERET.parent_class=0ANDT.name='safety';
GO

Vea tambin

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

16/17

10/10/2016

CREATETRIGGER(TransactSQL)

ALTER TABLE TransactSQL https://msdn.microsoft.com/esco/library/ms190273.aspx


ALTER TRIGGER TransactSQL https://msdn.microsoft.com/esco/library/ms176072.aspx
COLUMNS_UPDATED TransactSQL https://msdn.microsoft.com/esco/library/ms186329.aspx
CREATE TABLE TransactSQL https://msdn.microsoft.com/esco/library/ms174979.aspx
DROP TRIGGER TransactSQL https://msdn.microsoft.com/esco/library/ms173497.aspx
ENABLE TRIGGER TransactSQL https://msdn.microsoft.com/esco/library/ms182706.aspx
DISABLE TRIGGER TransactSQL https://msdn.microsoft.com/esco/library/ms189748.aspx
TRIGGER_NESTLEVEL TransactSQL https://msdn.microsoft.com/esco/library/ms182737.aspx
EVENTDATA TransactSQL https://msdn.microsoft.com/esco/library/ms173781.aspx
sys.dm_sql_referenced_entities TransactSQL https://msdn.microsoft.com/esco/library/bb677185.aspx
sys.dm_sql_referencing_entities TransactSQL https://msdn.microsoft.com/esco/library/bb630351.aspx
sys.sql_expression_dependencies TransactSQL https://msdn.microsoft.com/esco/library/bb677315.aspx
sp_help TransactSQL https://msdn.microsoft.com/esco/library/ms187335.aspx
sp_helptrigger TransactSQL https://msdn.microsoft.com/esco/library/ms189836.aspx
sp_helptext TransactSQL https://msdn.microsoft.com/esco/library/ms176112.aspx
sp_rename TransactSQL https://msdn.microsoft.com/esco/library/ms188351.aspx
sp_settriggerorder TransactSQL https://msdn.microsoft.com/esco/library/ms186762.aspx
UPDATE TransactSQL https://msdn.microsoft.com/esco/library/ms187326.aspx
Obtener informacin acerca de los desencadenadores DML https://msdn.microsoft.com/esco/library/ms179309.aspx
Obtener informacin acerca de los desencadenadores DDL https://msdn.microsoft.com/esco/library/ms184304.aspx
sys.triggers TransactSQL https://msdn.microsoft.com/esco/library/ms188746.aspx
sys.trigger_events TransactSQL https://msdn.microsoft.com/esco/library/ms187322.aspx
sys.sql_modules TransactSQL https://msdn.microsoft.com/esco/library/ms175081.aspx
sys.assembly_modules TransactSQL https://msdn.microsoft.com/esco/library/ms180052.aspx
sys.server_triggers TransactSQL https://msdn.microsoft.com/esco/library/ms176054.aspx
sys.server_trigger_events TransactSQL https://msdn.microsoft.com/esco/library/ms188375.aspx
sys.server_sql_modules TransactSQL https://msdn.microsoft.com/esco/library/ms187794.aspx
sys.server_assembly_modules TransactSQL https://msdn.microsoft.com/esco/library/ms188016.aspx

Adiciones de comunidad
2016 Microsoft

https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx

17/17

También podría gustarte