none
PASAR UN VALOR A UN TRIGGER RRS feed

  • Pregunta

  • Como puedo pasar un valor un TRIGGER

    Necesito pasarle un valor a mi trigger, para validar si existe en la tabla producto, antes de insertarlo a dicha tabla  

    martes, 17 de septiembre de 2019 21:28

Respuestas

  • Hola Valentin Alexis:

    A un trigger no se le pasan valores.

    Un trigger, dispone de los valores que has intentado insertar o actualizar o borrar en las pseudo tablas inserted o deleted, y por estas puedes saber si existe. 

    Aunque no es el camino recomendado, una posible solución.

    CREATE TABLE miprod
    (id     INT, 
     nombre VARCHAR(10)
    );
    GO
    INSERT INTO miprod
    (id, 
     nombre
    )
    VALUES
    (1,  'a');
    GO
    CREATE TRIGGER tr_miprod_insert ON dbo.miprod INSTEAD OF INSERT AS
    BEGIN
        IF(EXISTS
    	   (SELECT i.id FROM inserted i
                 INNER JOIN miprod m ON i.id = m.id
        ))
            BEGIN
                PRINT 'existe';
                ROLLBACK TRAN;
        END;
            ELSE
            BEGIN
                PRINT 'no existe';
                INSERT INTO miprod
                (id, 
                 nombre
                )
                       SELECT *
                       FROM inserted;
        END;
    END;
    GO

    Ahora en la tabla solo existe el registro de id = 1

    Puedo insertar tanto valores individuales, como varios a la vez:

    INSERT INTO miprod
    (id,  nombre)
    VALUES
    (2,  'b');
    GO
    INSERT INTO miprod
    (id, nombre)
    VALUES
    (3,'C'),
    (4,'D');

    Pero si inserto entre ellos uno que ya exista por id

    INSERT INTO miprod 
    (id, nombre)
    VALUES
    (5,'E'),
    (1,'C');

    existe
    Mens. 3609, Nivel 16, Estado 1, Línea 49
    La transacción terminó en el desencadenador. Se anuló el lote.

    SELECT id, nombre FROM dbo.miprod

    Salida

    id          nombre
    ----------- ----------
    1           a
    2           b
    3           C
    4           D

    (4 filas afectadas)

    Te recomendaría, que para esto, no utilices un trigger, y utilices mejor un procedimiento almacenado.

    CREATE PROCEDURE SP_miprod_insert (@ID INT, @NOMBRE VARCHAR(10)) AS BEGIN
            IF(EXISTS
            (
                SELECT * FROM miprod m WHERE M.ID = @ID
            ))
                BEGIN
                    PRINT 'existe';
        END;
                ELSE
                BEGIN
                    PRINT 'no existe';
                    INSERT INTO miprod
                    (id, nombre)
                    VALUES
                    (@ID, @NOMBRE);
            END;
            RETURN;
        END;

    GO

    Ejecución

    EXEC SP_MIPROD_INSERT 5,'D'; GO

    EXEC SP_MIPROD_INSERT 1,'A';

    GO

    existe

    SELECT id, nombre FROM dbo.miprod
    id          nombre
    ----------- ----------
    1           a
    2           b
    3           C
    4           D
    5           D
    (5 filas afectadas)


    miércoles, 18 de septiembre de 2019 4:55