Top Banner
– 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
24
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Un Ejemplo de Triggers Para El Control de Stock

– 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

Page 2: Un Ejemplo de Triggers Para El Control de Stock

  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

Page 3: Un Ejemplo de Triggers Para El Control de Stock

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.

Page 4: Un Ejemplo de Triggers Para El Control de Stock

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.

Page 5: Un Ejemplo de Triggers Para El Control de Stock

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

Page 6: Un Ejemplo de Triggers Para El Control de Stock

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:

Page 7: Un Ejemplo de Triggers Para El Control de Stock

Espero que les haya gustado, cualquier pregunta consúltenme, mi correo

[email protected]

domingo 2 de enero de 2011

0 comentarios:P

Page 8: Un Ejemplo de Triggers Para El Control de Stock

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.

Page 9: Un Ejemplo de Triggers Para El Control de Stock

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

Page 10: Un Ejemplo de Triggers Para El Control de Stock

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

Page 11: Un Ejemplo de Triggers Para El Control de Stock

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.

Page 12: Un Ejemplo de Triggers Para El Control de Stock

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

Page 13: Un Ejemplo de Triggers Para El Control de Stock

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'

Page 14: Un Ejemplo de Triggers Para El Control de Stock

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. 

Page 15: Un Ejemplo de Triggers Para El Control de Stock

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 

Page 16: Un Ejemplo de Triggers Para El Control de Stock

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. 

Page 17: Un Ejemplo de Triggers Para El Control de Stock

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

Page 19: Un Ejemplo de Triggers Para El Control de Stock

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

[Haga clic para ampliar]

Page 20: Un Ejemplo de Triggers Para El Control de Stock

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

Page 21: Un Ejemplo de Triggers Para El Control de Stock

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.