Crea Un Disparador

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

Crea un disparador, que es un tipo especial de procedimiento almacenado que se ejecuta automticamente cuando un usuario intenta la instruccin especificada

de modificacin de datos en la tabla especificada. Microsoft SQL Server permite la creacin de mltiples factores desencadenantes de una declaracin dada INSERT, UPDATE o DELETE.
Sintaxis

CREATE TRIGGER trigger_name ON { tabla | vista } [CON CIFRADO] { {{ PARA | DESPUS DE | EN VEZ DE} {[INSERT] [ , ] [UPDATE] [ , ] [BORRAR]} [CON APPEND] [NOT FOR REPLICATION] AS [{IF UPDATE ( columna ) [{Y | o} UPDATE ( columna ) ] [... n ] | SI ( COLUMNS_UPDATED () { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [... n ] }] sql_statement [ ... n ] } }
Alegaciones

trigger_name Es el nombre del disparador. A nombre del disparador debe ajustarse a las reglas de los identificadores y debe ser nico en la base de datos. Especificando el nombre del propietario de disparo es opcional. Tabla | vista Es la tabla o vista en la que se ejecuta el gatillo y se llama a veces el gatillo de la tabla o vista de disparo.Especificando el nombre del propietario de la tabla o vista es opcional. Una vista puede hacer referencia a slo un desencadenador INSTEAD OF. CON CIFRADO Indica que SQL Server convertir el texto original de la sentencia CREATE GATILLO a un formato ofuscado. Tenga en cuenta que ofuscado disparadores pueden ser de ingeniera inversa ya que SQL

Server debe de confundir-activa para su ejecucin. En SQL Server 2000, el texto protegido es visible en la syscomments tabla del sistema y pueden ser susceptibles a los intentos de ofuscacin. El uso de WITH ENCRYPTION impide que el desencadenador se publique como parte de la replicacin de SQL Server. DESPUS Especifica que el desencadenador se activa slo cuando todas las operaciones especificadas en la sentencia SQL se ha ejecutado con xito. Todas las acciones referenciales en cascada y las comprobaciones de restricciones deben tener xito antes de este disparador se ejecuta. DESPUS es el valor predeterminado, si A es la nica palabra clave especificada. Desencadenadores AFTER no se puede definir en las vistas. EN VEZ DE Especifica que se ejecute el desencadenador en lugar de la sentencia SQL, reemplazando as las acciones de los estados de activacin. A lo sumo, un desencadenador INSTEAD OF por INSERT, UPDATE o DELETE se puede definir en una tabla o vista. Sin embargo, es posible definir puntos de vista sobre las opiniones que cada opinin tiene su propio desencadenador INSTEAD OF. EN VEZ de disparadores no se permiten en las vistas actualizables WITH CHECK OPTION. SQL Server generar un error si un desencadenador INSTEAD OF se agrega a una vista actualizable WITH CHECK OPTION especificada. El usuario debe quitar esta opcin mediante ALTER VIEW antes de definir el desencadenador INSTEAD OF. {[DELETE] [ , ] [INSERT] [ , ] [UPDATE]} Son palabras clave que especifican que la modificacin declaraciones de datos, cuando se intent en contra de esta tabla o vista, activar el gatillo. Por lo menos una opcin debe ser especificado. Cualquier combinacin de estos en el orden que se permite en la definicin del disparador. Si ms de una opcin se especifica, separar las opciones con comas. Para los desencadenadores INSTEAD OF, la opcin DELETE no est permitido en las tablas que tienen una relacin referencial que especifique una accin ON DELETE en cascada. Del mismo modo, la opcin UPDATE no se permite en las tablas que tienen una relacin referencial que especifique una accin ON UPDATE en cascada. CON APPEND

Especifica que un disparador adicional de un tipo existente se debe agregar. El uso 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, la clusula WITH APPEND no es necesario agregar un desencadenador adicional de un tipo existente (ste es el comportamiento predeterminado de CREATE TRIGGER mayor compatibilidad con el nivel de configuracin de 70 o.) Para obtener ms informacin, consulte sp_dbcmptlevel . WITH APPEND no se puede utilizar con desencadenadores INSTEAD OF o si desencadenador AFTER se indica explcitamente. WITH APPEND slo se puede utilizar cuando se especifica FOR (sin lugar de o despus) por razones de compatibilidad hacia atrs. WITH APPEND y FOR (que se interpreta como AFTER) no se admitan en versiones futuras. NOT FOR REPLICATION Indica que la presin no debe ser ejecutado cuando un proceso de duplicacin modifica la tabla involucrada en el gatillo. AS Si las acciones que el gatillo es llevar a cabo. sql_statement Es la condicin de disparo (s) y accin (s). Trigger condiciones especifican criterios adicionales que determinan si los estados intentaron DELETE, INSERT o UPDATE causa la accin de disparo (s) que se llevarn a cabo. Las acciones del desencadenador especificadas en las instrucciones Transact-SQL entrar en vigor cuando la operacin DELETE, INSERT o UPDATE se intenta. Los desencadenadores pueden incluir cualquier nmero y tipo de instrucciones Transact-SQL. Un desencadenador est diseado para comprobar o cambiar los datos basados en una declaracin de modificacin de datos, no debe devolver los datos al usuario. Las instrucciones Transact-SQL en un desencadenador incluyen a menudo el lenguaje de control de flujo. A pocas mesas especiales se utilizan en instrucciones CREATE TRIGGER:

eliminados y aadir son lgicas (conceptuales) tablas. Ellos son estructuralmente similares a la mesa en la que se define el desencadenador, es decir, la tabla en la que la accin se intenta que el usuario, y mantenga los valores antiguos o nuevos valores de las filas que pueden ser modificados por la accin del usuario. Por ejemplo, para recuperar todos los valores en el borrado de tabla, utilice:
SELECT * FROM eliminado

En una, INSERT o UPDATE desencadenador DELETE, SQL Server no permite el texto , ntext o imagen de las referencias de columna en la inserta y elimina las tablas si el nivel de compatibilidad es igual a 70. El texto ,ntext , y la imagen de los valores de la inserta y elimina las tablas no se puede acceder. Para recuperar el nuevo valor, ya sea en un desencadenador INSERT o UPDATE, se unen al insertar la tabla a la tabla de actualizacin original. Cuando el nivel de compatibilidad es 65 o inferior, se devuelven valores NULL parainsertar o eliminar texto , ntext o imagen de las columnas que permiten valores nulos; cadenas de longitud cero se devuelven si las columnas no son nulos.

Si el nivel de compatibilidad es 80 o superior, SQL Server permite la actualizacin del texto , ntext o imagen delas columnas a travs del desencadenador INSTEAD OF en tablas o vistas. n Es un marcador que indica que Transact-SQL mltiples pueden ser incluidos en el gatillo. Para el IF UPDATE ( columna )declaracin, varias columnas se pueden incluir en las mismas UPDATE ( columna ) clusula. IF UPDATE ( columna ) Las pruebas de una accin INSERT o UPDATE para una columna determinada, que no se utiliza con operaciones DELETE. Ms de una columna puede ser especificado. Debido a que el nombre de la tabla se especifica en la clusula ON, no incluyen el nombre de la tabla antes de que el nombre de la columna en una clusula IF UPDATE. Para probar una accin INSERT o UPDATE para ms de una columna, especifique una por separado UPDATE ( columna ) de la siguiente clusula primera. IF UPDATE devolver el valor TRUE en las acciones INSERT porque en las columnas tienen valores ya sea explcita o implcita (NULL) valores insertados. Nota El IF UPDATE ( columna ) funciones clusula idntica a SI, SI ... ELSE o WHILE, y puede utilizar el bloque BEGIN ... END. Para obtener ms informacin, vea Control de flujo del lenguaje . ACTUALIZACIN ( columna ) se puede utilizar en cualquier lugar dentro del cuerpo del disparador. columna Es el nombre de la columna para poner a prueba, ya sea para una accin INSERT o UPDATE. Esta columna puede ser de cualquier tipo de datos soportados por SQL Server. Sin embargo, las columnas calculadas no se puede utilizar en este contexto. Para obtener ms informacin, vea Tipos de datos . SI ( COLUMNS_UPDATED ())

Las pruebas, en un desencadenador INSERT o UPDATE slo, si la columna o columnas mencionadas se insertan o actualizan. COLUMNS_UPDATED devuelve un varbinary patrn de bits que indica qu columnas de la tabla se insertan o actualizan. La funcin COLUMNS_UPDATED devuelve los bits en orden de izquierda a derecha, con el bit menos significativo es el del extremo izquierdo. El bit de la izquierda representa la primera columna de la tabla, el siguiente bit a la derecha representa la segunda columna, y as sucesivamente. COLUMNS_UPDATED devuelve varios bytes si la tabla en la que se crea el desencadenador contiene ms de 8 columnas, con el byte menos significativo es el del extremo izquierdo.COLUMNS_UPDATED devolver el valor TRUE para todas las columnas en las acciones INSERT porque en las columnas tienen valores explcitos o implcitos (NULL) valores insertados. COLUMNS_UPDATED puede utilizarse en cualquier lugar dentro del cuerpo del disparador. bitwise_operator Es el operador bit a bit para utilizar en la comparacin. updated_bitmask Es la mscara de bits de enteros de las columnas en realidad actualizado o insertado. Por ejemplo, la tabla t1 contiene las columnas C1 , C2 , C3 , C4 y C5 . Para comprobar si las columnas C2 , C3 y C4 estn actualizadas (con la tabla t1tiene un desencadenador UPDATE), especifique un valor de 14. Para comprobar si la columna slo C2 se actualiza, especifique un valor de 2. comparison_operator Es el operador de comparacin. Utilice el signo de igual (=) para comprobar si todas las columnas especificadas enupdated_bitmask son en realidad al da. Utilice el smbolo mayor que (>) para comprobar si alguna o algunas de las columnas especificadas en updated_bitmask se actualizan. column_bitmask Es la mscara de bits de enteros de las columnas para comprobar si se actualizan o se inserta.
Comentarios

Los factores desencadenantes son de uso frecuente para hacer cumplir las reglas de negocio y la integridad de datos.SQL Server proporciona integridad referencial declarativa (DRI) a travs de las declaraciones de creacin de la tabla (ALTER TABLE y CREATE TABLE), sin embargo, DRI no proporciona entre bases de datos de integridad referencial. Para exigir la integridad referencial (reglas acerca de las relaciones entre las claves primarias y externas de las tablas), utilice las restricciones de

claves primarias y externas (la clave principal y las palabras clave FOREIGN KEY de 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 ejecucin del desencadenador AFTER. Si se infringen las restricciones, sino que el disparo de acciones se revierten y el desencadenador AFTER no se ejecuta (despedido). El primero y el ltimo DESPUS disparadores para ser ejecutado en una tabla puede ser especificado utilizandosp_settriggerorder . Slo un primer y un disparo despus de la ltima de cada uno de los, UPDATE y DELETE operaciones INSERT se puede especificar en una mesa, y si hay otros desencadenadores AFTER en la misma tabla, se ejecutan aleatoriamente. Si una instruccin ALTER TRIGGER cambia un desencadenador o el ltimo en primer lugar, el primer atributo o el ltimo conjunto en el gatillo modificado se ha cado, y el valor de la orden se debe restablecer con sp_settriggerorder . Un disparador AFTER se ejecuta slo despus de la sentencia SQL, incluyendo todas las acciones referenciales en cascada y las comprobaciones de restricciones asociadas con el objeto actualizado o eliminado, ha ejecutado con xito. El desencadenador AFTER ve los efectos de la declaracin de disparo, as como todos los Actualizar en cascada referencial y acciones BORRAR causado por la sentencia en cuestin. Si un desencadenador INSTEAD OF definido en una tabla ejecuta una instruccin en la tabla que normalmente se dispare el desencadenador INSTEAD OF otra vez, el gatillo no se llama de forma recursiva. En su lugar, la instruccin se procesa como si la tabla no desencadenador INSTEAD OF e inicia la cadena de operaciones de restriccin y ejecuciones de desencadenadores AFTER. Por ejemplo, si un desencadenador se define como un desencadenador INSTEAD OF INSERT de una tabla, y el disparador se ejecuta una instruccin INSERT en la misma tabla, la instruccin INSERT ejecutada por el desencadenador INSTEAD OF no llama de nuevo el gatillo. El INSERT ejecutada por el desencadenador inicia el proceso de las medidas 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 contra de la opinin de que por lo general se dispare el desencadenador INSTEAD OF de nuevo, no se llama de forma recursiva. En su lugar, la declaracin se resuelve como modificaciones en las tablas base subyacentes de la vista. En este caso, la definicin de vista debe cumplir todas las restricciones para una vista actualizable. Para una definicin de vistas actualizables, veaModificar datos mediante una vista . Por ejemplo, si un desencadenador se define como un desencadenador INSTEAD OF UPDATE para una vista, y el disparador se ejecuta una instruccin UPDATE referencia a la misma vista, la instruccin UPDATE ejecutada por el desencadenador INSTEAD OF no llama de nuevo el gatillo. El UPDATE ejecutadas por el gatillo se procesa en la vista como si la vista no tena un desencadenador INSTEAD OF. Las columnas cambiado por la actualizacin debe ser resuelto con una nica tabla

base. Cada modificacin en una tabla base subyacente se inicia la cadena de las limitaciones de la aplicacin y activar los desencadenadores AFTER definidos para la tabla.
Limitaciones de disparo

CREATE TRIGGER debe ser la primera instruccin en el lote y se puede aplicar a una sola tabla. Un desencadenador se crea solamente en la base de datos actual, sin embargo, un desencadenador puede hacer referencia a objetos fuera de la base de datos actual. Si el nombre del propietario de disparo se especifica (para calificar el desencadenador), califique el nombre de la tabla de la misma manera. El grupo de disparo misma se puede definir una accin ms de un usuario (por ejemplo, INSERT y UPDATE) en la misma instruccin CREATE TRIGGER. EN VEZ DE BORRAR / UPDATE no se puede definir en una tabla que tiene una clave externa con una cascada de DELETE / UPDATE de accin definido. Cualquier instruccin SET se puede especificar dentro de un disparo. La opcin SET elegida permanece en efecto durante la ejecucin del gatillo y luego vuelve a su configuracin anterior. Cuando uno activa el desencadenador, los resultados se devuelven a la aplicacin de llamada, al igual que con los procedimientos almacenados. Para eliminar tener resultados devueltos a una solicitud debido a un disparo con el gatillo, no incluye ni las instrucciones SELECT que devuelven resultados, o declaraciones que realizan asignacin de variable en un desencadenador. Un desencadenador que incluye tanto las 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 las modificaciones a la tabla del desencadenador se permite. Si la asignacin variable debe producirse en un desencadenador, utilice una instruccin SET NOCOUNT a principios del gatillo para eliminar la devolucin de conjuntos de resultados. Una instruccin TRUNCATE TABLE no es capturado por un desencadenador DELETE. Aunque una instruccin TRUNCATE TABLE es, en efecto, un DELETE sin una clusula WHERE (quita todas las filas), no se registra y por lo tanto no puede ejecutar un desencadenador. Debido a que el permiso de los valores predeterminados de instruccin TRUNCATE TABLE para el propietario de la tabla y no es transferible, slo el propietario de la tabla debe estar preocupado por inadvertencia eludir un desencadenador DELETE con una instruccin TRUNCATE TABLE. La instruccin WRITETEXT, ya sea registrado o no manejado, no se activa un gatillo. Estas instrucciones de Transact-SQL no se permiten en un desencadenador:

ALTER DATABASE DISCO DE TAMAO RESUMEN DE CARGA RESTORE LOG

CREAR BASE DE DATOS DROP DATABASE RECONFIGURE

DISCO INIT BASE DE DATOS DE CARGA RESTORE DATABASE

Tenga en cuenta Dado que SQL Server no admite desencadenadores definidos por el usuario en las tablas del sistema, se recomienda que no definido por el usuario activa pueden crear en tablas del sistema.
Mltiples disparadores

SQL Server permite que varios factores desencadenantes que se crear para cada caso de modificacin de datos (DELETE, INSERT o UPDATE). Por ejemplo, si CREATE TRIGGER FOR UPDATE se ejecuta para una tabla que ya tiene un desencadenador UPDATE, a continuacin, un desencadenador de actualizacin adicional es creado. En versiones anteriores, slo un disparador para cada evento de modificacin de datos (INSERT, UPDATE, DELETE) se dej para cada tabla. Nota El comportamiento predeterminado de CREATE TRIGGER (con el nivel de compatibilidad de 70) es agregar desencadenadores adicionales a los desencadenadores existentes, si los nombres de disparo diferentes. Si los nombres son los de disparo, SQL Server devuelve un mismo mensaje de error. Sin embargo, si el nivel de compatibilidad es igual o inferior a 65, todo nuevo desencadenadores creados con la instruccin CREATE GATILLO sustituye a los desencadenadores existentes del mismo tipo, aunque los nombres son diferentes de disparo. Para obtener ms informacin, vea sp_dbcmptlevel .
Desencadenadores recursivos

SQL Server tambin permite la invocacin recursiva de desencadenadores cuando el desencadenadores recursivosopcin est habilitada en sp_dboption . Desencadenadores recursivos permiten dos tipos de repeticin que se produzca:

Indirectos recursividad Directo recursividad

Con la repeticin indirecta, una aplicacin actualiza la tabla T1 , que activa el desencadenador TR1 para actualizar la tabla T2 . En este escenario, el disparador T2 activa y actualiza la tabla T1 .

Con la repeticin directa, la aplicacin actualiza la tabla T1 , que activa el desencadenador TR1 para actualizar la tablaT1 . Porque la tabla T1 se ha actualizado, activar TR1 se activa de nuevo, y as sucesivamente. En este ejemplo se utiliza tanto directos e indirectos de disparo recursividad. Supongamos que dos desencadenadores de actualizacin, TR1 y TR2 , se definen en la tabla T1 . Trigger 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 . La inserta y elimina las tablas de un desencadenador dado contienen filas que corresponden slo a la instruccin UPDATE que invoc el gatillo. Nota El comportamiento anterior se produce slo si el desencadenadores recursivos establecimiento desp_dboption est habilitado. No hay un orden definido en el que varios desencadenadores definidos para un determinado evento se ejecutan. Cada disparo debe ser autnomo. Desactivacin de la desencadenadores recursivos ajuste slo previene recurrencias directa. Para deshabilitar la recursividad indirecta, as, establecer el desencadenadores anidados opcin de servidor en 0 con sp_configure . Si alguno de los factores desencadenantes hacer un ROLLBACK TRANSACTION, independientemente del nivel de anidamiento, no ms disparadores son ejecutados.
Desencadenadores anidados

Los desencadenadores pueden anidarse hasta un mximo de 32 niveles. Si un desencadenador cambia una tabla en la que no es otro disparador, el gatillo se activa el segundo y, a continuacin puede llamar a un disparo en tercer lugar, y as sucesivamente. Si algn desencadenador de la cadena pone en marcha un bucle infinito, el nivel de anidamiento se supera y el gatillo se cancela. Para deshabilitar los desencadenadores anidados, establezca la desencadenadores anidados opcin de sp_configure en 0 (apagado). La configuracin por defecto permite desencadenadores anidados.Si los desencadenadores anidados est apagado, desencadenadores recursivos tambin con discapacidad, independientemente de la desencadenadores recursivos establecimiento de sp_dboption .
Resolucin diferida de nombres

SQL Server permite Transact-SQL los procedimientos almacenados, disparadores, y los lotes para hacer referencia a tablas que no existen en tiempo de compilacin. Esta capacidad se denomina resolucin diferida de nombres. Sin embargo, si la instruccin Transact-SQL del procedimiento almacenado, desencadenador o el lote se refiere a una tabla definida en el procedimiento almacenado o desencadenador, se emite una advertencia en el momento de la creacin slo si el nivel de compatibilidad de ajuste (establecido por la ejecucin de sp_dbcmptlevel ) es igual a 65.Una

advertencia se emite en tiempo de compilacin si se utiliza un lote. Un mensaje de error se devuelve en tiempo de ejecucin si la tabla se hace referencia no existe. Para obtener ms informacin, consulte Resolucin diferida de nombres y compilacin .
Permisos

CREATE TRIGGER permisos predeterminados para el propietario de la tabla en la que se define el gatillo, eladministrador de sistemas funcin fija de servidor, y los miembros de la db_owner y db_ddladmin funciones de base de datos fijos, y no son transferibles. Para recuperar datos de una tabla o vista, un usuario debe tener permiso de instruccin SELECT en la tabla o vista.Para actualizar el contenido de una tabla o vista, un usuario debe tener INSERT, DELETE, UPDATE y permisos en la tabla o vista. Si un desencadenador INSTEAD OF existe en un punto de vista, el usuario debe tener INSERT, DELETE, UPDATE y privilegios en este punto de vista para emitir INSERT, DELETE y UPDATE en la vista, independientemente de si la ejecucin realiza realmente esa operacin en la vista .
Ejemplos
A. Use un gatillo con un mensaje de aviso

Este disparador ejemplo imprime un mensaje en el cliente cuando alguien intenta agregar o cambiar los datos de losttulos de la tabla. Nota mensaje 50009 es un mensaje definido por el usuario en sysmessages . Para obtener ms informacin sobre la creacin de mensajes definidos del usuario, consulte sp_addmessage .
USE pubs IF EXISTS (SELECT nombre sysobjects DE WHERE nombre = 'recordatorio' Y type = "TR") GOTA recordatorio GATILLO GATILLO recordatorio de GO CREATE en ttulos para insertar, actualizar AS RAISERROR (50.009, 16, 10) GO
B. Use un disparo con un recordatorio de mensaje de correo electrnico

En este ejemplo se enva un mensaje de correo electrnico a un amigo especfico (MaryM) cuando los ttulos decambios de la tabla.
USE pubs IF EXISTS (SELECT nombre sysobjects DE WHERE nombre = 'recordatorio' Y type = "TR") GOTA recordatorio de GO GATILLO GATILLO recordatorio CREAR en ttulos para INSERT, UPDATE, DELETE AS EXEC master .. xp_sendmail 'MaryM', 'Don' te olvides de imprimir un informe para los distribuidores. "GO
C. Use una regla de empresa desencadenador entre el empleado y las tablas de puestos de trabajo

Debido a las restricciones CHECK slo pueden hacer referencia las columnas en que se define la columna o restriccin de nivel de tabla, cualquier restriccin entre tablas (en este caso, las reglas de negocio) debe ser definido como factores desencadenantes.

En este ejemplo se crea un disparador que, cuando un nivel de trabajo de los empleados se inserta o actualiza, comprueba que el nivel laboral de los trabajadores especificado ( job_lvls ), en el que los salarios se basan, se encuentra dentro del rango definido para el trabajo. Para obtener el rango apropiado, el empleo de mesa deben ser de referencia.
USE pubs IF EXISTS (SELECT nombre sysobjects DE WHERE nombre = 'employee_insupd' y escriba = 'TR) DROP TRIGGER employee_insupd GO CREATE TRIGGER ON employee_insupd empleado para insertar, actualizar AS / * Obtener el rango de nivel para este tipo de trabajo de los puestos de trabajo mesa. * / DECLARE min_lvl tinyint, @ max_lvl tinyint, @ emp_lvl tinyint, smallint job_id SELECCIONAR @ @ min_lvl = min_lvl, max_lvl = max_lvl @, @ emp_lvl = i.job_lvl, @ job_id = empleado i.job_id DE INTERIOR SE UNEN i e insertado en e.emp_id = UNETE i.emp_id trabajos j = ON j.job_id i.job_id IF (@ job_id = 1) y (@ <emp_lvl> 10) COMENZAR RAISERROR ('Job id 1 espera que el nivel predeterminado de 10.', 16 , 1) ROLLBACK TRANSACTION END ELSE SI NO (ENTRE emp_lvl @ @ Y @ min_lvl max_lvl) COMENZAR RAISERROR ('El nivel de job_id:% d debe estar entre% dy% d.', 16, 1, @ job_id, @ min_lvl , @ max_lvl) ROLLBACK TRANSACTION END
D. Uso de resolucin diferida de nombres

En este ejemplo se crean dos disparadores para ilustrar la resolucin diferida de nombres.
USE pubs IF EXISTS (SELECT nombre sysobjects DE WHERE nombre = 'trig1' y escriba = 'TR) DROP TRIGGER trig1 GO - un disparador en una inexistente. Creacin de la tabla CREATE TRIGGER trig1 a los autores para insertar, UPDATE, DELETE y seleccionar el . au_lname, a.au_fname, x.info autores de un INNER JOIN does_not_exist x = ON a.au_id x.au_id GO Aqu est la declaracin para ver realmente el texto de la activacin DE. SELECCIONAR o.id, c.text sysobjects o INNER JOIN c syscomments SOBRE o.id = c.id DONDE o.type = "TR" y o.name = 'trig1' - Creacin de un disparo en una tabla existente, pero con una inexistente -. columna USO pubs IF EXISTS (SELECT nombre sysobjects DE WHERE nombre = 'trig2' y escriba = 'TR) DROP TRIGGER trig2 GO CREATE TRIGGER trig2 a los autores para insertar, actualizar AS DECLARE @ varchar fax (12) SELECT @ fax = telfono de los autores GO - - es la declaracin que en realidad el ver el texto del gatillo. Seleccione aqu o.id, c.text sysobjects DE o INNER JOIN c syscomments SOBRE o.id = c.id DONDE o.type = "TR" y o.name = 'trig2'
E. Uso COLUMNS_UPDATED

En este ejemplo se crean dos tablas: una employeeData mesa y una auditEmployeeData mesa. El employeeDatatabla, que contiene informacin de nminas de los empleados sensibles, puede ser modificado por los miembros del departamento de recursos humanos. Si el empleado nmero de seguro social del (SSN), el salario anual, nmero de cuenta bancaria o se cambia, un registro de auditora se genera y se inserta en el auditEmployeeData tabla de auditora. Al utilizar el COLUMNS_UPDATED () funcin, es posible comprobar rpidamente cualquier cambio a estas columnas que contienen informacin sensible de los empleados. Este uso de COLUMNS_UPDATED () slo funciona si usted est tratando de detectar cambios en las primeras 8 columnas de la tabla.
USE pubs IF EXISTS (SELECT TABLE_NAME INFORMATION_SCHEMA.TABLES DE DONDE TABLE_NAME = 'employeeData')

CUADRO employeeData GOTA IF EXISTS (SELECT TABLE_NAME INFORMATION_SCHEMA.TABLES DE DONDE TABLE_NAME = 'auditEmployeeData') GOTA auditEmployeeData CUADRO GO employeeData CREAR MESA ( emp_id int NOT NULL, emp_bankAccountNumber char (10) NOT NULL, emp_salary int NOT NULL, emp_SSN char (11) NOT NULL, nchar emp_lname (32) NOT NULL, nchar emp_fname (32) NOT NULL, emp_manager int NOT NULL ) GO auditEmployeeData CREAR MESA ( audit_log_id uniqueidentifier DEFECTO NEWID (), audit_log_type char (3) NOT NULL, audit_emp_id int NOT NULL, audit_emp_bankAccountNumber char (10) NULL, NULL audit_emp_salary int, audit_emp_SSN char (11) NULL, audit_user sysname DEFECTO SUSER_SNAME (), fecha y hora audit_changed DEFECTO GETDATE () ) GO GATILLO updEmployeeData CREAR EN employeeData PARA actualizacin AS / * Comprobar si las columnas 2, 3 o 4 se ha actualizado. Si alguna o todas de las columnas 2, 3 o 4 se han modificado, cree un registro de auditora. La mscara de bits es: alimentacin (2, (2-1)) + alimentacin (2, (3-1)) + alimentacin (2, (4-1)) = 14. Para comprobar si todas las columnas 2, 3 y 4 se actualizan, el uso = 14 en lugar de> 0 (por debajo) .* / SI (COLUMNS_UPDATED () y 14)> 0 / * Utilice SI (COLUMNS_UPDATED () y 14) = 14 a ver si todos los de las columnas 2, 3 y 4 se actualizan .* / COMENZAR - Auditora rcord anterior. INSERTAR EN auditEmployeeData (audit_log_type, audit_emp_id, audit_emp_bankAccountNumber, audit_emp_salary, audit_emp_SSN) 'SELECT' OLD, del.emp_id, del. emp_bankAccountNumber, del.emp_salary, del.emp_SSN DE eliminado del - Nuevo registro de auditora. INSERTAR EN auditEmployeeData (audit_log_type, audit_emp_id, audit_emp_bankAccountNumber, audit_emp_salary, audit_emp_SSN)

, seleccione 'Nuevo' ins.emp_id, ins.emp_bankAccountNumber, ins.emp_salary, complementos . emp_SSN DE inserta ins END GO / * Insercin de un nuevo empleado no causa el gatillo para disparar .* UPDATE / INSERT INTO employeeData VALUES (101, 'EE.UU.-987-01, 23000-R-M53550M, N'Mendel , N'Roland, 32) GO / * Actualizar el registro de empleado para el empleado nmero 101 a cambio del salario de 51 mil causas del desencadenador UPDATE al fuego y una pista de auditora a producirse .* / UPDATE employeeData emp_salary JUEGO = 51000 DONDE emp_id = 101 GO SELECT * FROM auditEmployeeData GO / * Actualizar el registro de empleado para el empleado nmero 101 al cambiar tanto el nmero de cuenta bancaria y nmero de seguro social (SSN) hace que el desencadenador UPDATE al fuego y una pista de auditora que se producir .* / employeeData UPDATE JUEGO emp_bankAccountNumber = '133146A0, emp_SSN = 'R-M53550M " DONDE emp_id = 101 GO SELECT * FROM auditEmployeeData GO
F. Utilice COLUMNS_UPDATED para probar ms de 8 columnas

Si usted debe probar las actualizaciones que afectan a otras columnas de las primeras 8 columnas de una tabla, debe utilizar la funcin SUBSTRING para probar la punta apropiada devuelto por COLUMNS_UPDATED. Este ejemplo prueba las actualizaciones que afectan a las columnas 3, 5 o 9 en la Northwind.dbo.Customers mesa.
USE Northwind GO DROP TRIGGER tr1 CREATE TRIGGER tr1 en los clientes PARA ACTUALIZAR COMO SI ((SUBSTRING (COLUMNS_UPDATED (), 1,1) = potencia (2, (3-1)) + alimentacin (2, (5-1))) Y (SUBSTRING (COLUMNS_UPDATED (), 2,1) = potencia (2, (1-1)))) 'IMPRIMIR' Las columnas 3, 5 y 9 de actualizacin GO UPDATE Clientes JUEGO ContactName ContactName = Direccin Direccin = Pas = Pas GO

También podría gustarte