Está en la página 1de 22

Un ejemplo de triggers para el control de Stock USE master GO IF EXISTS (SELECT NAME FROM sys.

databases WHERE name = StockArticulos) BEGIN DROP DATABASE StockArticulos END CREATE DATABASE StockArticulos GO USE StockArticulos GO CREATE TABLE dbo.Articulos (ID INT PRIMARY KEY, NOMBRE VARCHAR(100),STOCK DECIMAL(18,2)) GO CREATE TABLE dbo.Movimientos (TRANSACCION INT,FECHA DATEDEFAULT(GETDATE()),ARTICULO_ID INT FOREIGN KEY REFERENCES DBO.ARTICULOS(ID),CANTIDAD DECIMAL(18,2), TIPO CHAR(1) CHECK (TIPO =I OR TIPO = O)) GO Insertamos registros a la tabla Articulos INSERT INTO dbo.Articulos(ID,NOMBRE,STOCK) VALUES (1,Monitores,0),(2,CPU,0),(3,Mouse,0) GO Creamos los triggers para tener actualizado los articulos CREATE TRIGGER dbo.MovimientosInsert ON dbo.Movimientos FOR INSERT AS BEGIN No retorna el mensaje de cantidad de registros afectados SET NOCOUNT ON UPDATE DBO.ARTICULOS SET STOCK = STOCK + T.PARCIAL FROM DBO.ARTICULOS A INNER JOIN ( SELECT ARTICULO_ID, SUM(CASE WHEN TIPO=I THEN CANTIDAD ELSE -CANTIDAD END) AS PARCIAL FROM INSERTED GROUP BY ARTICULO_ID )T ON A.ID = T.ARTICULO_ID END GO CREATE TRIGGER dbo.MovimientosDelete ON dbo.Movimientos FOR DELETE AS BEGIN No retorna el mensaje de cantidad de registros afectados SET NOCOUNT ON UPDATE dbo.Articulos

SET STOCK = STOCK T.PARCIAL FROM dbo.Articulos A INNER JOIN ( SELECT ARTICULO_ID, SUM(CASE WHEN TIPO=I THEN CANTIDAD ELSE -CANTIDAD END) AS PARCIAL FROM DELETED GROUP BY ARTICULO_ID )T ON A.ID = T.ARTICULO_ID END GO Probemos el ejercicio Mostremos el Stock actual SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A Insertemos un registro para el articulo 1 INSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO) VALUES (1,1,GETDATE(),100,I') Mostremos el Stock actual para el ID 1 SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A WHERE A.ID = 1 Insertemos otros registros INSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO) VALUES (2,1,GETDATE(),10,I'), (3,1,GETDATE(),5,O'), (4,2,GETDATE(),5,I') Mostremos el Stock actual para el ID 1 SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A WHERE A.ID = 1 Eliminemos la transaccion (1) de cantidad = 100 DELETE FROM dbo.Movimientos WHERE TRANSACCION = 1 Eliminemos la transaccion (3) de cantidad = 5 DELETE FROM dbo.Movimientos WHERE TRANSACCION = 3 Mostremos el stock actual de la tabla Articulos SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A Elkiminamos todos los movimientos realizados DELETE FROM dbo.Movimientos Deshabilitar los triggers ALTER TABLE dbo.Movimientos DISABLE TRIGGER ALL Mostremos lo que pasa se insertamos un registro en la tabla Movimientos que tiene deshabilitados los triggers INSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO) VALUES (1,1,GETDATE(),100,I') Mostremos el stock actual de la tabla Articulos SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A

Trigger en Transact SQL (SQL Server 2008) Ejemplo de Insert (DML)


Publicado por Cristian Ayala en 16:42 Etiquetas: SQL Server

En esta ocasin voy a publicar como crear un Trigger desde cero, para que tengan un pantallazo en general un Trigger es como su nombre lo dice un desencadenador, el cual ejecuta una serie de operaciones Transact SQL al producirse una accin en la base de datos, esta accin puede ser cambios a nivel datos (DML Data Manipulation Language) y a nivel esquema (DDL Data Definition Language), los cambios a nivel de datos se refieren a INSERT/DELETE/UPDATE que se puedan producir en los datos de la base de datos. Los Triggers se usan generalmente para hacer auditorias sobre las tablas, y para tener un mejor control de las mismas, ya que si los datos son borrados los mismos se pueden recuperar, tambin se pueden usar para guardar datos de algo en especifico como las compras de un proveedor. Empezamos con el ejemplo de DML para cuando se produzca una accin de Insert sobre una determinada tabla. Las tablas que guardan estas acciones son dos INSERTED (inserciones) y DELETED (borrados). Para ello creamos una tabla producto y otra tabla que contendr todos los productos insertados. Tabla Productos, tb_Productos, tiene los campos idProducto (llave primaria, identidad), nombre, precio.

Tabla tb_Productos_Audit_Insert, tiene los campos idProducto (clave primaria), nombre, precio, accin (guardara el nombre de la accin producida), fecha_accion (guarda la fecha y hora cuando se produce la accin de insert).

Cargo datos en la tabla Productos.

Luego creamos el Trigger: CREATE TRIGGER [dbo]. [tg_Productos_Audit_Insert] //NOMBRE DEL TRIGGER ON [dbo].[tb_Productos] //ELEGIMOS LA TABLA SOBRE LA CUAL SE REALIZARA FOR INSERT //ELEGIMOS LA ACCION AS DECLARE @now datetime //DECLARO UNA VARIABLE QUE GUARDE LA FECHA Y HORA DECLARE @accion nvarchar(10) //DECLARO UNA VARIABLE QUE TENDRA EL NOMBRE DE LA ACCION BEGIN TRY //PONEMOS LA EJECUCION DE LA CONSULTA SQL DENTRO DE UN TRY PARA QUE SI NO SE EJECUTA CORRECTAMENTE HACEMOS UN ROLLBACK DE LA TRANSACCION SET @now = getdate() //TOMO LA FECHA Y HORA SET @accion = 'INSERTED' //PONGO EL NOMBRE DE LA ACCION INSERT INTO [dbo].[tb_Productos_Audit_Insert] //TABLA PARA LA AUDITORIA DEL INSERT (idProducto, Nombre, Precio, Accion, Fecha_Accion) SELECT INSERTED.idProducto, INSERTED.Nombre, INSERTED.Precio, @accion, @now FROM INSERTED // TRAE LOS VALORES DE LA TABLA INSERTED, SI BORRAMOS LOS DATOS LA TABLA VIRTUAL QUE CONTENDRA LOS DATOS BORRADOS ES DELETED END TRY BEGIN CATCH ROLLBACK TRANSACTION //VUELVE ATRAS LOS CAMBIOS

RAISERROR (HUBO UN ERROR SOBRE LA INSERCION DE LA TABLA AUDITORA DE PRODUTOS,20,1) END CATCH GO HACEMOS ALGUNOS INSERT SOBRE LA TABLA PRODUCTOS. HACEMOS una consulta de SELECT sobre la tabla auditora:

Los Triggers se guardan sobre la tabla en donde se utilizara:

Espero que les haya gustado, cualquier pregunta consltenme, mi correo escristian.ayala08@gmail.com domingo 2 de enero de 2011

0 comentarios: P

Triggers en Transact SQL


Un trigger( o desencadenador) es una clase especial de procedimiento almacenado que se ejecuta automticamente cuando se produce un evento en el servidor de bases de datos. SQL Server proporciona los siguientes tipos de triggers:

Trigger 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. Trigger DDL, se ejecutan en respuesta a una variedad de eventos de 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.

Trigger DML.
Los trigger 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. La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER <Trigger_Name, sysname, Trigger_Name> ON <Table_Name, sysname, Table_Name> AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE> AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for trigger here END

Antes de ver un ejemplo es necesario conocer las tablas inserted y deleted.

Las instrucciones de triggers DML utilizan dos tablas especiales denominadas inserted y deleted. SQL Server 2005 crea y administra automticamente ambas tablas. La estructura de las tablas insertedy deleted es la misma que tiene la tabla que ha desencadenado la ejecucin del trigger. La primera tabla (inserted) solo est disponible en las operaciones INSERT y UPDATE y en ella estn los valores resultantes despues de la insercin o actualizacin. Es decir, los datos insertados.Inserted estar vacia en una operacin DELETE. En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, estn los valores anteriores a la ejecucin de la actualizacin o borrado. Es decir, los datos que sern borrados. Deletedestar vacia en una operacion INSERT. No existe una tabla UPDATED? No, hacer una actualizacin es lo mismo que borrar (deleted) e insertar los nuevos (inserted). La sentencia UPDATE es la nica en la que inserted y deleted tienen datos simultaneamente. No puede se modificar directamente los datos de estas tablas. El siguiente ejemplo, graba un historico de saldos cada vez que se modifica un saldo de la tabla cuentas.
CREATE TRIGGER TR_CUENTAS ON CUENTAS AFTER UPDATE AS BEGIN -- SET NOCOUNT ON impide que se generen mensajes de texto -- con cada instruccin SET NOCOUNT ON; INSERT INTO HCO_SALDOS (IDCUENTA, SALDO, FXSALDO) SELECT IDCUENTA, SALDO, getdate() FROM INSERTED END

La siguiente instruccin provocar que el trigger se ejecute:


UPDATE CUENTAS SET SALDO = SALDO + 10 WHERE IDCUENTA = 1

Una consideracin a tener en cuenta es que el trigger se ejecutar aunque la instruccion DML (UPDATE, INSERT o DELETE ) no haya afectado a ninguna fila. En este caso inserted y deleteddevolveran un conjunto de datos vacio. Podemos especificar a que columnas de la tabla debe afectar el trigger.
ALTER TRIGGER TR_CUENTAS ON CUENTAS AFTER UPDATE AS BEGIN -- SET NOCOUNT ON impide que se generen mensajes de texto -- con cada instruccin SET NOCOUNT ON;

IF UPDATE(SALDO) -- Solo si se actualiza SALDO BEGIN INSERT INTO HCO_SALDOS (IDCUENTA, SALDO, FXSALDO) SELECT IDCUENTA, SALDO, getdate() FROM INSERTED END

END

Los trigger estn dentro de la transaccin original (Insert, Delete o Update) por lo cual si dentro de nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrs nuestro trigger sino tambin toda la transaccin; en otras palabras si en un trigger ponemos un RollBack Tran, la transaccin de Insert, Delete o Update volver toda hacia atrs.
ALTER TRIGGER TR_CUENTAS ON CUENTAS AFTER UPDATE AS BEGIN -- SET NOCOUNT ON impide que se generen mensajes de texto -- con cada instruccin SET NOCOUNT ON; INSERT INTO HCO_SALDOS (IDCUENTA, SALDO, FXSALDO) SELECT IDCUENTA, SALDO, getdate() FROM INSERTED

ROLLBACK END

En este caso obtendremos el siguiente mensaje de error:


La transaccin termin en el desencadenador. Se anul el lote.

Podemos activar y desactivar Triggers a tarvs de las siguientes instrucciones.

-- Desactiva el trigger TR_CUENTAS

DISABLE TRIGGER TR_CUENTAS ON CUENTAS GO -- activa el trigger TR_CUENTAS ENABLE TRIGGER TR_CUENTAS ON CUENTAS GO -- Desactiva todos los trigger de la tabla CUENTAS ALTER TABLE CUENTAS DISABLE TRIGGER ALL GO -- Activa todos los trigger de la tabla CUENTAS ALTER TABLE CUENTAS ENABLE TRIGGER ALL

Trigger DDL
Los trigger DDL se ejecutan en respuesta a una variedad de eventos de 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. La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER <trigger_name, sysname, table_alter_drop_safety> ON DATABASE FOR <data_definition_statements, , DROP_TABLE, ALTER_TABLE> AS BEGIN ... END

La siguiente instruccin impide que se ejecuten sentencias DROP TABLE y ALTER TABLE

en la base de datos.
CREATE TRIGGER TR_SEGURIDAD ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS BEGIN RAISERROR ('No est permitido borrar ni modificar tablas !' , 16, 1) ROLLBACK TRANSACTION END

IF exists(select table_name from information_schema.tables where table_name = 'tblAfectar') BEGIN DROP TABLE tblAfectar END GO CREATE TABLE tblAfectar (intId int identity(1,1), strValor varchar(50)) GO SET NOCOUNT ON INSERT INTO tblAfectar (strValor) SELECT 'EJEMPLO1' SELECT * FROM tblAfectar GO IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[trgAS_InfoForos]')) DROP TRIGGER [dbo].[trgAS_InfoForos] GO /****** Object: Trigger [dbo].[trgAS_InfoForos] 06/15/2010 11:39:13 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Descripcin: Ejemplo de funcionamiento de trigger Script Date:

-- Author: Yovento -- Fecha: 2010-06-16 -- ============================================= CREATE TRIGGER [dbo].[trgAS_InfoForos] ON [dbo].[tblAfectar] AFTER INSERT,UPDATE AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; Declare @strValor varchar(50) --Se obtienen los nuevos valores de la tabla, en este caso guardamos los valores en una variable SELECT @strValor = strValor FROM INSERTED SET @strValor = ISNULL(@strValor,'') + ' INGRESADO POR TRIGGER' INSERT INTO tblAfectar (strValor) VALUES (@strValor) END GO INSERT INTO tblAfectar (strValor) values ('NUEVO VALOR') GO SELECT * FROM tblAfectar

Un disparador es un tipo especial de procedimiento almacenado que se ejecuta automticamente cuando un usuario intenta especificado en los datos de modificacin de la declaracin de la tabla especificada. Los disparadores se utiliza a menudo para hacer cumplir las reglas de negocio y la integridad de datos. La integridad referencial se puede definir mediante el uso de restricciones FOREIGN KEY con la sentencia CREATE TABLE. Si existen restricciones en la "mesa de gatillo", que son controlados antes de la ejecucin del desencadenador. Si las restricciones son violadas, el gatillo no es la sintaxis para la creacin de run.The factores desencadenantes es CREATE TRIGGER [el propietario]. Trigger_name ON [propietario.] Nombre_tabla PARA {INSERT, UPDATE} [de WITH ENCRYPTION] AS IF UPDATE (column_name) [{y | o} UPDATE (column_name) SQL_statements ...] donde

trigger_name: Es el nombre del disparador. A nombre del disparador debe ajustarse a las reglas de los identificadores y debe ser nico dentro de la base de datos. table_name: Especifica la tabla en la que se ha ejecutado el desencadenador INSERT, UPDATE, DELETE: Son palabras clave que especifican las declaraciones de modificacin de datos, cuando se intenta en esta tabla, se activar el gatillo. Cualquier combinacin (en cualquier orden) de stos estn permitidos en la definicin del disparador. CIFRADO: Cifra las entradas syscomments que contienen el texto de la sentencia CREATE TRIGGER. COMO SQL_statements: Especificar las condiciones de activacin y acciones. Condiciones del desencadenador especifican los criterios adicionales que determinan si el INSERT intento, DELETE, o UPDATE har que la accin de disparo (s) que se llev a cabo. Las acciones del desencadenador especificadas en las instrucciones SQL entrar en vigor cuando la accin del usuario (UPDATE, INSERT o DELETE) se intenta. Si las acciones mltiples de activacin se especifican, se agrupan dentro de un bloque BEGIN ... END. Los disparadores pueden incluir cualquier nmero y tipo de sentencias SQL, pero no debe incluir la instruccin SELECT. Un disparador tiene la intencin de revisar o cambiar los datos sobre la base de una instruccin de modificacin de datos, no debe devolver los datos al usuario. Las sentencias de SQL de un desencadenador incluyen a menudo el control de flujo del lenguaje. Ejemplo 1: Esta activacin se utiliza para insertar y actualizar los valores en un campo de fecha y hora cuando el usuario inserta datos en campo de fecha (VARCHAR) y el campo de hora (varchar). Esta activacin tambin se utiliza la funcin CONVERT para convertir el tipo de datos varchar al tipo de datos de fecha y hora. CREATE TRIGGER trg_datetime_insert EN dbo.stroke_data Para insertar, actualizar AS ACTUALIZACIN stroke_data SET onset_datetime = CONVERT (DATETIME, onset_date +'' + onset_time) ACTUALIZACIN stroke_data SET er_datetime = CONVERT (DATETIME, er_date +'' + er_time) ACTUALIZACIN stroke_data SET exam_datetime = CONVERT (DATETIME, exam_date +'' + exam_time) ACTUALIZACIN stroke_data SET first_datetime = CONVERT (DATETIME, first_date +'' + first_time) ACTUALIZACIN stroke_data SET consult_called_dt = CONVERT (DATETIME, consult_called_date +'' + consult_called_time) ACTUALIZACIN stroke_data SET consult_arrived_dt = CONVERT (DATETIME, consult_arrived_date +'' + consult_arrived_time) GO Ejemplo 2:

Este ejemplo es una adicin a la anterior. En este disparador, no slo actualizar el campo de fecha y hora durante ms de una columna, sino tambin comprobar para ver si la fecha es nulo. Cuando es nula, se escribe un valor nulo en el campo de fecha y hora respectiva. Aqu se utiliza el mismo tiempo .. bucle para pasar por cada registro CREATE TRIGGER ON trg_time4 dbo.tbl_time2 para insertar, actualizar AS declarar @ Fecha varchar (20), @ tiempo varchar (20), @ MAX_ID INT, @ I INT SELECT @ I = 1 SELECT @ MAX_ID = MAX (int_id) DE tbl_time2 ACTUALIZACIN tbl_time2 SET onset_datetime = CONVERT (DATETIME, onset_date +'' + onset_time) ACTUALIZACIN tbl_time2 SET er_datetime = CONVERT (DATETIME, er_date +'' + er_time) ACTUALIZACIN tbl_time2 SET exam_datetime = CONVERT (DATETIME, exam_date +'' + exam_time) ACTUALIZACIN tbl_time2 SET first_datetime = CONVERT (DATETIME, first_date +'' + first_time) MIENTRAS @ I <= @ MAX_ID BEGIN SELECT @ fecha = onset_date DE DONDE tbl_time2 int_id = @ I SELECT @ = tiempo onset_time DE tbl_time2WHERE int_id = @ I IF (@ fecha es nulo) BEGIN ACTUALIZACIN onset_datetime SET tbl_time2 = NULL DONDE int_id = @ I FIN SELECT @ fecha = er_date DE DONDE tbl_time2 int_id = @ I SELECT @ = tiempo er_time DE DONDE tbl_time2 int_id = @ I IF (@ fecha es nulo) o (@ tiempo es nulo) BEGIN ACTUALIZACIN er_datetime SET tbl_time2 = NULL DONDE int_id = @ I FIN SELECT @ fecha = exam_date DE DONDE tbl_time2 int_id = @ I

SEL ECT @ = tiempo exam_time DE DONDE tbl_time2 int_id = @ I


IF (@ fecha es nulo) BEGIN ACTUALIZACIN exam_datetime SET tbl_time2 = NULL DONDE int_id = @ I FIN SELECT @ fecha = first_date DE DONDE tbl_time2 int_id = @ I SELECT @ = tiempo first_time DE DONDE tbl_time2 int_id = @ I IF (@ fecha es nulo) BEGIN ACTUALIZACIN first_datetime SET tbl_time2 = NULL DONDE int_id = @ I FIN SELECT @ @ I = I +1 FIN GO Observaciones:

Uno de los problemas que tuvimos con estos factores fue que iba a escribir 01 de enero 1900 12:00 AM en el campo de fecha y hora whenver hubo un NULL en campos de fecha y tiempo. El problema se solucion utilizando el mtodo de lazo. Sin embargo, mi jefe, Dick no quera que el disparador para recorrer cada registro individual. As que decidi escribir el gatillo sin el bucle Hemos intentado muchos enfoques diferentes para abordar el problema sin mucho xito. Inicialmente se utiliz si .. entonces las declaraciones, junto con la funcin de conversin a escribir NULLS en lugar de 01 de enero 1900 12:00 AM. Este fue un xito en los casos en que entramos en un principio nulos. Si el usuario entra en el formato correcto para la fecha y la hora, las columnas de fecha y hora volver a 1 de enero 1900 12:00 AM. Una de las razones por las que esto ocurre tiene que ver con el comandoUPDATE .. SET. Cuando se utiliza este comando sin la clusula WHERE, las actualizaciones de SQL Server todos los registros de la columna. Puesto que no quera usar el lazo, no hemos podido encontrar una manera de utilizar la clusula WHERE con eficacia.Esto fue muy frustrante y no tenemos una solucin para estos problemas todava.

Crear y trabajar con desencadenadores


Un disparador es como un procedimiento de evento que se ejecuta cuando los datos cambian. Puede crear disparadores que se ejecutan en respuesta a las inserciones, actualizaciones y eliminaciones. Los desarrolladores utilizan disparadores para hacer cumplir las reglas de negocio e incluso para realizar tareas tales como la insercin de datos en un registro de auditora. Creacin de Disparadores Para crear o modificar un disparador:
1. Haga clic para expandir el nodo de la tabla a la que desea agregar el gatillo. El nodo de disparadores aparece (ver Figura 14.3 ). Figura 14.3. El nodo desencadenantes muestra los desencadenadores existentes asociados con una tabla. [Haga clic para ampliar]

2. Haga clic derecho en el nodo de disparadores y seleccione nuevo disparo. Una ventana de consulta nueva aparece, lo que le permite escribir el texto para el gatillo (ver figura 14.4 ).

Figura 14.4. La nueva ventana de consulta le permite escribir el T-SQL, que comprende el gatillo. [Haga clic para ampliar]

3. Escriba el T-SQL que comprende el gatillo. 4. Ejecutar la sentencia CREATE TRIGGER (ver figura 14.5 ). Despus de actualizar la lista de factores desencadenantes, que aparece en la lista de factores desencadenantes asociados a esa tabla (ver figura 14.6 ). Figura 14.5. Es preciso ejecutar el T-SQL para crear el gatillo. [Haga clic para ampliar]

Figura 14.6. Una vez creado, un disparador aparece en la lista de los activadores disponibles para esa tabla. [Haga clic para ampliar]

La sintaxis de un disparador es
CREATE TRIGGER triggername En TableName PARA [INSERTAR], [UPDATE], [BORRAR] AS - Cdigo de activacin

He aqu un ejemplo:
CREAR NoDeleteActive GATILLO [dbo]. [Productos] PARA ELIMINAR AS DECLARE @ Bit descatalogado SELECT @ Discontinued = suspendi a partir eliminado SI @ Descatalogado = 0 BEGIN ROLLBACK TRAN RAISERROR ('producto activo no puede ser eliminado', 16,1) FIN

Este disparador evala para ver si el producto que el usuario est

intentando eliminar se interrumpe. Si es as, SQL Server aborta el proceso de borrado y muestra un mensaje de error. El siguiente es un ejemplo de un desencadenador que inserta datos en un registro de auditora cada vez que el usuario actualiza una fila:
CREAR InsertProductAudit GATILLO dbo.Products FOR UPDATE AS DECLARE @ ProductID int, @ ProductName nvarchar (40), @ El dinero PrecioUnidad, @ UnidadesEnExistencias SmallInt SELECT @ ProductID = ProductID, ProductName = @ ProductName, @ PrecioUnidad = Precio por unidad = @ UnidadesEnExistencias UnidadesEnExistencias DE insertada Insertar valores ProductsAudit (@ ProductID, ProductName @, @ UnitPrice @ UnidadesEnExistencias)

Este ejemplo inserta datos en un registro de auditora cada vez que el usuario modifica los datos de la tabla Productos.
INSTEAD OF

Un LUGAR DE desencadenador se activa en lugar de la accin de disparo. Se ejecuta despus de SQL Server crea las tablas insertadas y eliminadas, pero antes de que SQL Server tiene cualquier otra accin. SQL Server ejecuta desencadenadoresINSTEAD OF antes de las restricciones se aplican. Esto le permite realizar la pre-procesamiento que las limitaciones de los suplementos existentes.

También podría gustarte