– Un ejemplo de triggers para el control de StockUSE masterGOIF EXISTS (SELECT NAME FROM sys.databases WHERE name = ‘StockArticulos’) BEGIN DROP DATABASE StockArticulos ENDCREATE DATABASE StockArticulosGOUSE StockArticulosGOCREATE TABLE dbo.Articulos (ID INT PRIMARY KEY, NOMBRE VARCHAR(100),STOCK DECIMAL(18,2))GOCREATE TABLE dbo.Movimientos (TRANSACCION INT,FECHA DATEDEFAULT(GETDATE()),ARTICULO_ID INT FOREIGN KEYREFERENCES DBO.ARTICULOS(ID),CANTIDAD DECIMAL(18,2), TIPO CHAR(1) CHECK (TIPO =’I’ OR TIPO = ‘O’))GO– Insertamos registros a la tabla ArticulosINSERT INTO dbo.Articulos(ID,NOMBRE,STOCK) VALUES (1,’Monitores’,0),(2,’CPU’,0),(3,’Mouse’,0)GO– Creamos los triggers para tener actualizado los articulosCREATE TRIGGER dbo.MovimientosInsert ON dbo.MovimientosFOR INSERTASBEGIN — 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_IDENDGOCREATE TRIGGER dbo.MovimientosDelete ON dbo.MovimientosFOR DELETEASBEGIN — 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_IDENDGO– Probemos el ejercicio– Mostremos el Stock actualSELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A– Insertemos un registro para el articulo 1INSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO)VALUES (1,1,GETDATE(),100,’I')– Mostremos el Stock actual para el ID 1SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A WHERE A.ID = 1– Insertemos otros registrosINSERT 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 1SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A WHERE A.ID = 1– Eliminemos la transaccion (1) de cantidad = 100DELETE FROM dbo.Movimientos WHERE TRANSACCION = 1– Eliminemos la transaccion (3) de cantidad = 5DELETE FROM dbo.Movimientos WHERE TRANSACCION = 3– Mostremos el stock actual de la tabla ArticulosSELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A– Elkiminamos todos los movimientos realizadosDELETE FROM dbo.Movimientos– Deshabilitar los triggersALTER TABLE dbo.Movimientos DISABLE TRIGGER ALL– Mostremos lo que pasa se insertamos un registro en la tabla– Movimientos que tiene deshabilitados los triggersINSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO)VALUES (1,1,GETDATE(),100,’I')– Mostremos el stock actual de la tabla ArticulosSELECT 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 ocasión 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 acción en la base de datos, esta acción 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, también 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 acción 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,
acción (guardara el nombre de la acción producida), fecha_accion (guarda la fecha y hora
cuando se produce la acción 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 consúltenme, mi correo
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 automáticamente 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 manipulación 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 definición 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 manipulación 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 automáticamente ambas tablas. La estructura de las tablas insertedy deleted es la misma que tiene la tabla que ha desencadenado la ejecución del trigger.
La primera tabla (inserted) solo está disponible en las operaciones INSERT y UPDATE y en ella están los valores resultantes despues de la inserción o actualización. Es decir, los datos insertados.Inserted estará vacia en una operación DELETE.
En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, están los valores anteriores a la ejecución de la actualización o borrado. Es decir, los datos que serán borrados. Deletedestará vacia en una operacion INSERT.
¿No existe una tabla UPDATED? No, hacer una actualización 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 instrucción
SET NOCOUNT ON;
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
END
La siguiente instrucción provocará que el trigger se ejecute:
UPDATE CUENTAS
SET SALDO = SALDO + 10
WHERE IDCUENTA = 1
Una consideración 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 instrucción
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 están dentro de la transacción original (Insert, Delete o Update) por lo cual si dentro de nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrás nuestro trigger sino también toda la transacción; en otras palabras si en un trigger ponemos un RollBack Tran, la transacción de Insert, Delete o Update volverá toda hacia atrás.
ALTER TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
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 transacción terminó en el desencadenador. Se anuló el lote.
Podemos activar y desactivar Triggers a tarvés 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 definición 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
IF exists(select table_name from information_schema.tables where table_name = 'tblAfectar')
BEGINDROP 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] Script Date: 06/15/2010 11:39:13 ******/SET ANSI_NULLS ONGO
SET QUOTED_IDENTIFIER ONGO
-- =============================================-- Descripción: Ejemplo de funcionamiento de trigger-- Author: Yovento-- Fecha: 2010-06-16-- =============================================CREATE TRIGGER [dbo].[trgAS_InfoForos] ON [dbo].[tblAfectar] AFTER INSERT,UPDATEAS 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 = strValorFROM 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 automáticamente cuando un usuario intenta especificado en los datos de modificación de la declaración 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 ejecución del desencadenador. Si las restricciones son violadas, el gatillo no es la sintaxis para la creación 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 modificación de datos, cuando se intenta en esta tabla, se activará el gatillo. Cualquier combinación (en cualquier orden) de éstos están permitidos en la definición del disparador.
CIFRADO: Cifra las entradas syscomments que contienen el texto de la sentencia CREATE TRIGGER.
COMO SQL_statements: Especificar las condiciones de activación y acciones. Condiciones del desencadenador especifican los criterios adicionales que determinan si el INSERT intento, DELETE, o UPDATE hará que la acción de disparo (s) que se llevó a cabo. Las acciones del desencadenador especificadas en las instrucciones SQL entrará en vigor cuando la acción del usuario (UPDATE, INSERT o DELETE) se intenta. Si las acciones múltiples de activación se especifican, se agrupan dentro de un bloque BEGIN ... END.
Los disparadores pueden incluir cualquier número y tipo de sentencias SQL, pero no debe incluir la instrucción SELECT. Un disparador tiene la intención de revisar o cambiar los datos sobre la base de una instrucción de modificación 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 activación 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 activación también se utiliza la función 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 ACTUALIZACIÓN stroke_data SET onset_datetime = CONVERT (DATETIME, onset_date +'' + onset_time) ACTUALIZACIÓN stroke_data SET er_datetime = CONVERT (DATETIME, er_date +'' + er_time) ACTUALIZACIÓN stroke_data SET exam_datetime = CONVERT (DATETIME, exam_date +'' + exam_time) ACTUALIZACIÓN stroke_data SET first_datetime = CONVERT (DATETIME, first_date +'' + first_time) ACTUALIZACIÓN stroke_data SET consult_called_dt = CONVERT (DATETIME, consult_called_date +'' + consult_called_time) ACTUALIZACIÓN stroke_data SET consult_arrived_dt = CONVERT (DATETIME, consult_arrived_date +'' + consult_arrived_time) GO
Ejemplo 2:
Este ejemplo es una adición a la anterior. En este disparador, no sólo actualizar el campo de fecha y hora durante más de una columna, sino también 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 ACTUALIZACIÓN tbl_time2 SET onset_datetime = CONVERT (DATETIME, onset_date +'' + onset_time) ACTUALIZACIÓN tbl_time2 SET er_datetime = CONVERT (DATETIME, er_date +'' + er_time) ACTUALIZACIÓN tbl_time2 SET exam_datetime = CONVERT (DATETIME, exam_date +'' + exam_time) ACTUALIZACIÓN 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 ACTUALIZACIÓN 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 ACTUALIZACIÓN 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 ACTUALIZACIÓN 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 ACTUALIZACIÓN 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 método de lazo. Sin embargo, mi jefe, Dick no quería 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 función de conversión 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 cláusula WHERE, las actualizaciones de SQL Server todos los registros de la columna. Puesto que no quería usar el lazo, no hemos podido encontrar una manera de utilizar la cláusula WHERE con eficacia.Esto fue muy frustrante y no tenemos una solución para estos problemas todavía.
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 inserción de datos en un registro de auditoría.
Creación 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 ). Después 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 - Código de activación
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 evalúa 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 auditoría 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 auditoría cada vez que el usuario modifica los datos de la tabla Productos.
INSTEAD OF
Un LUGAR DE desencadenador se activa en lugar de la acción de disparo. Se ejecuta después de SQL Server crea las tablas insertadas y eliminadas, pero antes de que SQL Server tiene cualquier otra acción. 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.