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 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
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 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

La siguiente instrucción 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] Script Date:


06/15/2010 11:39:13 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Descripción: Ejemplo de funcionamiento de trigger
-- 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 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.

También podría gustarte