Inicio > Curso básico de SQL Server 2008, Transact-SQL > Ejemplo de triggers – Sql Server 2008

Ejemplo de triggers – Sql Server 2008


– 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 DATE DEFAULT(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

About these ads
  1. Triggercita
    18 enero 2011 en 3:26 pm

    Muy buenos los ejemplos, pero queria consultarte sobre la posibilidad de que una vez que se inserta un registro en una tabla, el trigger lo que haga sea guardar en otra tabla un atributo de tipo string, el cual este formado por los nuevos atributos.
    Ejemplo:

    CREATE TRIGGER nueva_moneda BEFORE INSERT ON moneda
    FOR EACH ROW BEGIN
    INSERT INTO actualizaciones SET sentencia = ‘INSERT INTO currencies (symbol, name) values ( ‘ + NEW.simb_mda + ‘,’ + NEW.nom_mda;
    END

    se entiende?
    Agradezco cualquier ayuda!!!
    Saludos

  2. MgR
    27 agosto 2011 en 10:04 am

    Muy bueno!! se comprendió a la primera..
    gracias por el aporte

  3. carlos
    17 noviembre 2011 en 10:44 pm

    mira asi se hace….
    CREATE TRIGGER nueva_moneda BEFORE INSERT ON moneda
    FOR EACH ROW BEGIN
    INSERT INTO actualizaciones SET sentencia = ‘INSERT INTO currencies (symbol, name) values ( ‘ + NEW.simb_mda + ‘,’ + NEW.nom_mda;
    END

  4. celso
    17 noviembre 2011 en 10:50 pm

    gracias me sirvio…

  5. seba
    13 enero 2012 en 2:33 am

    estoy haciendo un trabajo practico en visual .net 2008 y sql 2008.
    en un formulario realizo las altas, bajas y modificaciones, pero resulta que cuando ingreso un registro que se encuentra en la base de datos me lo carga, desearía que a través del stored procedured, me muestre un mensaje (si esta repetido o no el registro) y que luego ese mensaje se registre a traves del formulario de visual. podrian ayudarme?
    paso el codiGo que tengo en el formulario y el stored.

    Private Sub ToolStrip_Agregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStrip_Agregar.Click
    Dim cmd As New SqlCommand
    oconexion.Open()
    cmd = New SqlCommand(“alta_titular”, oconexion)
    cmd.CommandType = CommandType.StoredProcedure
    cmd.Parameters.Add(“@cuit_titular”, SqlDbType.VarChar, 11).Value = txt_cuit_titular.Text
    cmd.Parameters.Add(“@razon_social”, SqlDbType.NVarChar, 50).Value = txt_titular.Text
    cmd.ExecuteNonQuery()
    oconexion.Close()

    MessageBox.Show(txt_titular.Text & ” ” & “Agregado”)
    Me.cargadatos()
    end sub

    Private Sub cargadatos()
    Dim cmd As New SqlCommand
    cmd = New SqlCommand(“select_titulares”, oconexion)
    Dim odataadapter As New SqlDataAdapter(cmd)
    Dim odataset As New DataSet
    odataset.Clear()
    oconexion.Open()
    odataadapter.Fill(odataset, “titulares”)
    oconexion.Close()
    Me.dgv_titular.DataSource = odataset
    Me.dgv_titular.DataMember = “titulares”

    txt_cuit_titular.Text = “”
    txt_titular.Text = “”
    ToolStrip_Agregar.Enabled = False

    ToolStrip_Modificar.Enabled = False
    ToolStrip_eliminar.Enabled = False

    End Sub

    —————————————————————————————–
    STORED PROCEDURE

    ALTER procedure [dbo].[alta_titular]
    @cuit_titular varchar (11),
    @razon_social nvarchar(50)

    as

    IF EXISTS (SELECT * FROM Titulares WHERE cuit_titular = @cuit_titular)
    –if (select count(*) from Titulares where cuit_titular=’27204845196′) = 0
    begin
    print ‘El dato esta duplicado’
    end
    else
    begin
    insert into Titulares
    (cuit_titular, razon_social)
    values
    (@cuit_titular, @razon_social)
    end

  6. YAS
    4 marzo 2012 en 10:10 pm

    cOMO PUEDO CREAR UN TRIGGER QUE SOLO ACEPTE DOS LETRAS SEGUIDA DE DOS DIGITOS

  7. 13 abril 2012 en 11:17 pm

    un saludo quiero hacer un trigger o desencadenador que me permita asegurar la integridad referencial entre dos tablas que estan relacionadad.. como puedo hacerlo.. me podras ayudar .. respondeme a jorge _ av 91 @hotmail.com porfabor urguente

    • 5 abril 2013 en 9:45 pm

      Solo utiliza la integridad referencia se la DB … salvo que sea algo mas complejo lo que quieras hacer

  8. Luis Cortegano
    3 diciembre 2012 en 10:22 pm

    gracias………ta chevere

  9. Acuario051
    12 diciembre 2012 en 10:58 pm

    Muy bueno me esta ayudando bastante

  1. No trackbacks yet.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

%d personas les gusta esto: