DML son las siglas de Data Manipulation Language y se refiere a los comandos que permiten a un usuario manipular los datos en un repositorio, es decir, añadir, consultar, borrar o actualizar. En SQL los comandos SELECT, INSERT, UPDATE y DELETE son comandos DML Otras ódenes como COMMIT, START TRANSACTION o ROLLBACK están en el límite de lo que podemos considerar órdenes DML de SQL puesto que no inciden en la manpilación o consulta de datos pero sí en el proceso en que esto se realiza. Por cierto que lo de "START TRANSACTION" no es estándar y depende de la implementación de SQL (en Sybase si no recuerdo mal, una transacción se modela poniendo el AUTOCOMMIT a false y tras hacer el COMMIT o ROLLBACK, a true). Desencadenadores DMLUn desencadenador DML es una acción programada para ejecutarse cuando se produce un evento DML (lenguaje de manipulación de datos) en el servidor de base de datos. Los eventos DML incluyen instrucciones UPDATE, INSERT o DELETE emitidas en una tabla o una vista. Los desencadenadores DML se utilizan para exigir reglas de negocios cuando se modifican los datos y para ampliar la lógica de comprobación de integridad de las restricciones, valores predeterminados y reglas de Microsoft SQL Server. Los temas de esta sección proporcionan la información necesaria para comprender, diseñar e implementar desencadenadores DML.
Descripción de los desencadenadores DML Explica los conceptos de los desencadenadores DML e incluye descripciones y ejemplos del momento en que se implementan estos desencadenadores.
Diseñar desencadenadores DML Se proporcionan directrices, reglas y restricciones que se deben tener en cuenta para diseñar desencadenadores DML.
Implementar desencadenadores DML Se describen los procedimientos para crear, modificar o eliminar desencadenadores DML. Descripción de los desencadenadores DML Microsoft SQL Server proporciona dos mecanismos principales para hacer cumplir las reglas de negocios y la integridad de los datos: restricciones y desencadenadores. Un desencadenador es un tipo especial de procedimiento almacenado que se inicia automáticamente cuando se ejecuta un evento de lenguaje. SQL Server incluye tres tipos generales de desencadenadores: DML, DDL y de inicio de sesión. Los desencadenadores DDL se invocan cuando tiene lugar un evento de lenguaje de definición de datos (DDL) en el servidor o la base de datos.Se explican con mayor detalle en
Desencadenadores DDL. Los desencadenadores de inicio de sesión activan procedimientos almacenados en respuesta a un evento LOGON. Este evento se genera cuando se establece una sesión de usuario con una instancia de SQL Server. Para obtener más información, vea
Desencadenadores logon. Los desencadenadores DML se invocan cuando un evento de lenguaje de manipulación de datos (DML) tiene lugar en la base de datos. Los eventos DML incluyen instrucciones INSERT, UPDATE o DELETE que modifican datos en una tabla o vista especificada. Un desencadenador DML puede consultar otras tablas e incluir instrucciones Transact-SQL complejas. El desencadenador y la instrucción que lo activa se tratan como una sola transacción, que puede revertirse desde el desencadenador. Si se detecta un error grave (por ejemplo, no hay suficiente espacio en disco), se revierte automáticamente toda la transacción. Los desencadenadores DML tienen varias utilidades: Pueden realizar cambios en cascada mediante tablas relacionadas de la base de datos; sin embargo, estos cambios pueden ejecutarse de manera más eficaz mediante restricciones de integridad referencial en cascada. Pueden proteger contra operaciones INSERT, UPDATE y DELETE incorrectas o dañinas, y exigir otras restricciones que sean más complejas que las definidas con restricciones CHECK. A diferencia de éstas, los desencadenadores DML pueden hacer referencia a columnas de otras tablas. Por ejemplo, un desencadenador puede utilizar una instrucción SELECT de otra tabla para comparar con los datos insertados o actualizados y para realizar acciones adicionales, como modificar los datos o mostrar un mensaje de error definido por el usuario. Pueden evaluar el estado de una tabla antes y después de realizar una modificación de datos y actuar en función de esa diferencia. Varios desencadenadores DML del mismo tipo (INSERT, UPDATE o DELETE) en una tabla permiten realizar distintas acciones en respuesta a una misma instrucción de modificación. Diseñar desencadenadores DML En esta sección se explican los factores que se deben tener en cuenta al diseñar un desencadenador DML. Tema Descripción
Directrices de planeamiento del desencadenador DML Explica las distintas formas en que se pueden diseñar desencadenadores AFTER y desencadenadores INSTEAD OF.
Especificar cuándo se activa un desencadenador DML Ofrece ejemplos que ilustran las diferencias de comportamiento de activación entre los desencadenadores AFTER e INSTEAD OF.
Ejecución de desencadenadores DML Explica cómo se ejecutan los desencadenadores AFTER e INSTEAD OF una vez activados.
Diseñar desencadenadores INSTEAD OF Describe directrices de diseño únicas para desencadenadores INSTEAD OF.
Administrar la seguridad de los desencadenadores Describe cómo se puede ejecutar el código de desencadenador con privilegios concentrados y cómo reducir esta amenaza. Implementar desencadenadores DML Antes de crear un desencadenador DML, tenga en cuenta que: La instrucción CREATE TRIGGER debe ser la primera del lote. Las demás instrucciones del lote se interpretan como parte de la definición de la instrucción CREATE TRIGGER. De forma predeterminada, el permiso para crear un desencadenador DML corresponde al propietario de la tabla, que no puede transferirlo a otros usuarios. Los desencadenadores DML son objetos de base de datos y sus nombres deben ajustarse a las reglas definidas para los identificadores. Sólo se pueden crear desencadenadores DML en la base de datos actual, aunque un desencadenador DML puede hacer referencia a objetos que se encuentren fuera de esta base de datos. No es posible crear un desencadenador DML en una tabla temporal o del sistema, aunque los desencadenadores DML pueden hacer referencia a tablas temporales. No se debe hacer referencia a las tablas del sistema; en su lugar, utilice las
vistas de esquema de información. No se puede definir desencadenadores INSTEAD OF DELETE o INSTEAD OF UPDATE en una tabla con una clave externa definida con una acción DELETE o UPDATE. Aunque una instrucción TRUNCATE TABLE sea como una instrucción DELETE sin la cláusula WHERE (elimina todas las filas), no provoca la activación de los desencadenadores DELETE, porque es una instrucción que no se registra. La instrucción WRITETEXT no provoca la activación de los desencadenadores INSERT ni UPDATE. Importante: La capacidad de devolver conjuntos de resultados desde desencadenadores se eliminará en una versión posterior de SQL Server. Los desencadenadores que devuelven conjuntos de resultados pueden provocar un comportamiento inesperado en aplicaciones que no estén diseñadas para utilizarlos. Evite la devolución de conjuntos de resultados desde desencadenadores en los nuevos trabajos de desarrollo y piense en modificar las aplicaciones que la usan actualmente. Para evitar que los desencadenadores devuelvan conjuntos de resultados en SQL Server, asigne el valor 1 a la opción
disallow results from triggers (opción). El valor predeterminado de esta opción será 1 en una versión futura de SQL Server. Cuando cree un desencadenador DML, especifique: El nombre. La tabla en la que se define el desencadenador. El momento de activar el desencadenador. Las instrucciones de modificación de datos que activarán el desencadenador. Son opciones válidas: INSERT, UPDATE o DELETE. Varias instrucciones de modificación de datos pueden activar el mismo desencadenador. Por ejemplo, se puede activar un desencadenador mediante instrucciones INSERT y UPDATE. Las instrucciones de programación que realizan la acción desencadenadora. Varios desencadenadores DML Una tabla puede tener varios desencadenadores AFTER de un tipo determinado, siempre que tengan nombres distintos. Todo desencadenador puede llevar a cabo numerosas funciones. Sin embargo, sólo se puede aplicar a una tabla. Por otra parte, un único desencadenador puede aplicarse a cualquier subconjunto de las tres acciones del usuario (UPDATE, INSERT y DELETE). Una tabla sólo puede tener un desencadenador INSTEAD OF de un tipo determinado. Permisos y propiedad de un desencadenador Los desencadenadores se crean en el esquema de la tabla o vista en la que están definidos. Por ejemplo, si el desencadenador Trigger1 se crea en una tabla HumanResources.Employee, el nombre completo del esquema del desencadenador es HumanResources.Trigger1. De forma predeterminada, los permisos CREATE TRIGGER son del propietario de la tabla en la que se ha definido el desencadenador, de la función de servidor fija sysadmin y de los miembros de funciones fijas de base de datos db_owner y db_ddladmin, y no se pueden transferir. Al crear un desencadenador INSTEAD OF en una vista, la cadena de propiedad se rompe si el propietario de la vista no es también propietario de las tablas base a las que hacen referencia tanto la vista como el desencadenador. Para cualquier tabla base que no pertenezca al propietario de la vista, el propietario de la tabla deberá conceder los permisos necesarios por separado, a fin de que cualquier usuario pueda leer o actualizar la vista. Si ésta y las tablas base subyacentes pertenecen al mismo usuario, será necesario conceder permisos a otros usuarios sólo para la vista, no para las tablas base individuales. Para obtener más información, vea
Cadenas de propiedad. Para crear un desencadenador
CREATE TRIGGER (Transact-SQL)