martes, 9 de diciembre de 2014

Trigger Update (Disparador de actualización declarando variables)

Los Trigger son Disparadores que se ejecutan siempre y cuando una instrucción en este caso "update" intenta actualizar campos de una tabla. El siguiente ejemplo explica como declarar una variable dentro de un trigger y como condicionar la actualización a rangos específicos.



Tenemos las siguientes tablas como lo muestra el diagrama de datos:
* Aspecto
* Criterio
* Factor
* Parámetros
* Oficinas
Problema: Se requiere actualizar la columna  Base de la tabla Parametros  pero cuando se actualice cada registro no debe superar el rango del NumCriterio asignado de la tabla Criterio,  es decir si el numero_criterio de rango es 10 los para metros pertenecientes a este no deben superar 10. ejemplo(parametro1 = 10; parametro2 = 8; parametro3 = 2) como pueden observar en la tabla.


Primero se crea y se nombre el Trigger en la base de datos que se vaya a utilizar. 

USE [Pruebas_BD]
GO

CREATE TRIGGER CondActualizar_CampoBase ON Parametros FOR update
AS

Luego se Declaran las variables a utilizar. Recordar que para asignarle un valor a una variable debe ser dentro del select.

/* Declaro variables a usar */
 DECLARE
    @IDCRITERIO AS INT,
    @BASE AS INT,
    @NUMCRITERIO AS INT


Estos dos SELECT traen los datos que se necesitan de cada tabla, criterio y parámetros para poderlos unir en la condición final. deben recordar que las tablas deben tener una columna que las relaciones, en este ejemplo en la tabla Parámetros esta  relacionada con Criterio por la columna IdCriterio

/* Este select me permite capturar el id del criterio que el parámetro tiene asignado, tambien capturo la base modifidaca (nuevo valor) */
 SELECT
  @IDCRITERIO = T1.[IdCriterio],
  @BASE = T2.Base
 FROM
  [Parametros] T1 -- Valores actuales
 INNER JOIN
  INSERTED T2 -- Valores nuevo
   ON T1.[IdParametro] = T2.IdParametro

 /* Este select me permite capturar el valor de criterio (Valor máximo permitido en el parámetro) */
 SELECT
  @NUMCRITERIO = T1.[NumCriterio]
 FROM
  [Criterio] T1
 WHERE
  T1.[IdCriterio] = @IDCRITERIO -- Es el id del criterio que maneja el parámetro

Al finalizar se coloca la condición que define al Trigger:


/* Finalmente compraro el valor nuevo ingresado a la base, con el máximo permitido, si es mayor niego la actualización */
 IF(@BASE > @NUMCRITERIO)
 BEGIN
  raiserror('No se puede actualizar la base excede el criterio.', 10, 1)-- este mensaje aparece al negar la actualización
  rollback transaction -- para todas las transacciones
 END

Al final queda así el código completo:

USE [Pruebas_BD]
GO

CREATE TRIGGER CondActualizar_CampoBase ON Parametros FOR update
AS
 /* Declaro variables a usar */
 DECLARE
  @IDCRITERIO AS INT,
  @BASE AS INT,
  @NUMCRITERIO AS INT

 /* Este select me permite capturar el id del criterio que el parámetro tiene asignado, tambien capturo la base modifidaca (nuevo valor) */
 SELECT
  @IDCRITERIO = T1.[IdCriterio],
  @BASE = T2.Base
 FROM
  [Parametros] T1 -- Valores actuales
 INNER JOIN
  INSERTED T2 -- Valores nuevo
   ON T1.[IdParametro] = T2.IdParametro

 /* Este select me permite capturar el valor de criterio (Valor máximo permitido en el parámetro) */
 SELECT
  @NUMCRITERIO = T1.[NumCriterio]
 FROM
  [Criterio] T1
 WHERE
  T1.[IdCriterio] = @IDCRITERIO -- Es el id del criterio que maneja el parámetro

 /* Finalmente compraro el valor nuevo ingresado a la base, con el máximo permitido, si es mayor niego la actualización */
 IF(@BASE > @NUMCRITERIO)
 BEGIN
  raiserror('No se puede actualizar la base excede el criterio.', 10, 1)
  rollback transaction
 END

2 comentarios:

  1. These are our "PROYECTS"?, u need to fix that. IS "PROJECTS" not "PROYECTS"

    ResponderEliminar
  2. sorry, but i will correct this mistake in my home because i am traveling.

    ResponderEliminar