SQL)
Otras versiones
Crea un disparador DML, DDL o de logon. Un disparador es una clase especial de procedimiento
almacenado que se ejecuta automticamente cuando se produce un evento en el servidor de
bases de datos. Los disparadores 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, vea Desencadenadores DML.
Los disparadores 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 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 pueden crearse directamente a partir de instrucciones de Transact-SQL 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.
Nota de seguridad
Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual), Windows
Azure SQL Database (desde la versin inicial hasta la versin actual).
Convenciones de sintaxis de Transact-SQL
Sintaxis
-- SQL Server Syntax
Trigger on an INSERT, UPDATE, or DELETE statement to a table or view
(DML Trigger)
<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 ]
Trigger on a LOGON event (Logon Trigger)
<logon_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
Sintaxis
-- Windows Azure SQL Database Syntax
Trigger on an INSERT, UPDATE, or DELETE statement to a table or view
(DML Trigger)
<dml_trigger_option> ::=
[ EXECUTE AS Clause ]
-- Windows Azure SQL Database Syntax
Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE
STATISTICS statement (DDL Trigger)
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, 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_typeo event_group tienen lugar en la
base de datos actual.
ALL SERVER
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 >
Nota
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.
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.
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 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.
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 Transact-SQL no estn permitidas en un desencadenador DML:
Nota
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
Nota
ndice
[ocultar]
1Componentes principales
2Tipos
3Efectos y caractersticas
4Ejemplo
5Disparadores en MySQL
6Disparadores en PostgreSQL
7Enlaces externos
Componentes principales[editar]
La estructura bsica de un trigger es:
Tipos[editar]
Existen dos tipos de disparadores que se clasifican segn la cantidad de ejecuciones a
realizar:
Row Triggers (o Disparadores de fila): son aquellas que se ejecutaran cada vez que
se llama al disparador desde la tabla asociada al trigger
Statement Triggers (o Disparadores de secuencia): son aquellos que sin importar la
cantidad de veces que se cumpla con la condicin, su ejecucin es nica.
Pueden ser de sesin y almacenados; pero no son recomendables[cita requerida].
Efectos y caractersticas[editar]
No aceptan parmetros o argumentos (pero podran almacenar los datos afectados en
tablas temporales)
No pueden ejecutar las operaciones COMMIT o ROLLBACK porque estas son parte
de la sentencia SQL del disparador (nicamente a travs de transacciones autnomas)
Pueden causar errores de mutaciones en las tablas, si se han escrito de manera
deficiente.
Ejemplo[editar]
Un sencillo ejemplo (para SQL Server) sera crear un Trigger para insertar un pedido de
algn producto cuando la cantidad de ste, en nuestro almacn, sea inferior a un valor
dado.
UPDATE ARTICULOS
SET STOCK = STOCK - 20
WHERE ID_ARTICULO = 1
Disparadores en MySQL[editar]
Los disparadores son soportados en MySQL a partir de la versin 5.0.2. Algunos de los
soportes existentes son los disparadores para las
sentencias INSERT, UPDATE y DELETE
El estndar SQL:2003 requiere que los disparadores den a los programadores acceso a
las variables de un registro utilizando una sintaxis como REFERENCING NEW AS n. Por
ejemplo, si un disparador est monitoreando los cambios en la columna salario, podra
escribirse un disparador como:
Como en MySQL las sentencias se ejecutan luego de escribir el signo punto y coma (;),
cabe destacar que para crear un disparador en MySQL, antes se escribe la
sentencia DELIMITER seguida de un carcter tal como |, la cual asigna la funcin del
punto y coma (;) a otro carcter permitiendo que el disparador sea escrito usando los punto
y comas sin que se ejecute mientras se escribe; despus de escrito el disparador se
escribe nuevamente la sentencia DELIMITER ; para asignar al punto y coma su funcin
habitual.
Disparadores en PostgreSQL[editar]
Desde 1997 PostgreSQL soporta el uso de disparadores, estos pueden anexarse a las
tablas pero no a las vistas; aunque a las vistas se les pueden crear reglas.
Al igual que en MySQL los disparadores de PostgreSQL se pueden activar luego de
sentencias INSERT, UPDATE o DELETE
Cuando hay varios disparadores, se activan en orden alfabtico.
Adems de permitir el uso de funciones en el lenguaje nativo de PostgreSQL, PL/PgSQL,
los disparadores tambin permiten invocar funciones escritas en otros lenguajes como
PL/Perl.
En Postgres un disparador ejecuta una funcin la cual contiene el cdigo de lo que se
requiere, esto difiere del mtodo expuesto anteriormente para MySQL que escribe el
cdigo a ejecutarse dentro del mismo disparador.
El siguiente es un ejemplo de disparador creado con su respectiva funcin:
ejemplo 2: