Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CREATETRIGGER(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
https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx
4/17
10/10/2016
CREATETRIGGER(TransactSQL)
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
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 >
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.
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.
ALTER INDEX
DROP INDEX
DBCC DBREINDEX
DROP TABLE
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)
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.
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)
IFOBJECT_ID('Sales.reminder1','TR')ISNOTNULL
DROPTRIGGERSales.reminder1;
GO
CREATETRIGGERreminder1
ONSales.Customer
AFTERINSERT,UPDATE
ASRAISERROR('NotifyCustomerRelations',16,10);
GO
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
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
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
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.
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;
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)
Adiciones de comunidad
2016 Microsoft
https://msdn.microsoft.com/esco/library/ms189799(d=printer).aspx
17/17