none
Ayuda sql RRS feed

  • Pregunta

  • Alguien que pueda ayudarme con un ejecicio de sql de triggers nose ni como empezar, gracias.

    Lo q necesito es un trigger para una tamla 'project' que lance una excepcion si un departamento asigna mas de 3 proyectos.

    domingo, 25 de noviembre de 2018 14:58

Respuestas

  • Hola danni96:

    Se supone que un trigger, es un desencadenador, que ocurre cuando se va a realizar una acción. Para realizar tu ejercicio, tienes que utilizar un trigger instead of insert, para que realice la acción antes de insertar.

    Te pongo un ejemplo que tienes que pulir. Es muy cercano a tu escenario, lo que tienes que tener claro, es que no es una insercción, que el trigger utiliza una pseudo tabla que contiene los registros que se quieren insertar.

    create table proyectos (id int identity(1,1), nombre varchar(100), departamento int)
    go
    insert into proyectos (nombre, departamento)
    values
    ('alfa',1),('beta',2)
    go
    create TRIGGER tr_proyectos ON proyectos
    INSTEAD OF INSERT
    AS
         BEGIN
             BEGIN TRY
                 DECLARE @regs TABLE
    (nombre       VARCHAR(100),
     departamento INT,
     cantidad     INT
    );
                 INSERT INTO @regs
                        SELECT i.nombre,
                               i.departamento,
                               NULL
                        FROM inserted i;
    		
    /*en inserted puede haber varios registros y no solo uno */
    
                 IF((SELECT departamento FROM @regs) = 2)
                     BEGIN
                         RAISERROR(N'Error del tipo', 10, 1, N'504', 5);
                     END;
                     ELSE
                     BEGIN
                         INSERT INTO proyectos(nombre, departamento)
                                SELECT i.nombre,
                                       i.departamento
                                FROM inserted i /*la pseudo tabla inserted la puedes relacionar con la tabla a la que vas a insertar */
                                     LEFT JOIN proyectos p ON i.departamento = p.departamento;
                     END;
             END TRY
             BEGIN CATCH
                 THROW;
             END CATCH;
         END; 
    

    Cuando intentas insertar, en el ejemplo con un departamento = 2

    Enlaces que te pueden ayudar.

    https://docs.microsoft.com/es-es/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017

    http://www.tutorialesprogramacionya.com/sqlserverya/temarios/descripcion.php?cod=152&punto=146&inicio=

    Ya comentas como te va.

    domingo, 25 de noviembre de 2018 21:04

Todas las respuestas

  • Con una descripcion tan incompleta no creo que sea posible ayudarte, ademas de que si este es un ejercicio, tu deberias al menos intentar hacerlo y nosotros te podemos ayudar en dudas puntuales.

    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    domingo, 25 de noviembre de 2018 20:54
  • Hola danni96:

    Se supone que un trigger, es un desencadenador, que ocurre cuando se va a realizar una acción. Para realizar tu ejercicio, tienes que utilizar un trigger instead of insert, para que realice la acción antes de insertar.

    Te pongo un ejemplo que tienes que pulir. Es muy cercano a tu escenario, lo que tienes que tener claro, es que no es una insercción, que el trigger utiliza una pseudo tabla que contiene los registros que se quieren insertar.

    create table proyectos (id int identity(1,1), nombre varchar(100), departamento int)
    go
    insert into proyectos (nombre, departamento)
    values
    ('alfa',1),('beta',2)
    go
    create TRIGGER tr_proyectos ON proyectos
    INSTEAD OF INSERT
    AS
         BEGIN
             BEGIN TRY
                 DECLARE @regs TABLE
    (nombre       VARCHAR(100),
     departamento INT,
     cantidad     INT
    );
                 INSERT INTO @regs
                        SELECT i.nombre,
                               i.departamento,
                               NULL
                        FROM inserted i;
    		
    /*en inserted puede haber varios registros y no solo uno */
    
                 IF((SELECT departamento FROM @regs) = 2)
                     BEGIN
                         RAISERROR(N'Error del tipo', 10, 1, N'504', 5);
                     END;
                     ELSE
                     BEGIN
                         INSERT INTO proyectos(nombre, departamento)
                                SELECT i.nombre,
                                       i.departamento
                                FROM inserted i /*la pseudo tabla inserted la puedes relacionar con la tabla a la que vas a insertar */
                                     LEFT JOIN proyectos p ON i.departamento = p.departamento;
                     END;
             END TRY
             BEGIN CATCH
                 THROW;
             END CATCH;
         END; 
    

    Cuando intentas insertar, en el ejemplo con un departamento = 2

    Enlaces que te pueden ayudar.

    https://docs.microsoft.com/es-es/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017

    http://www.tutorialesprogramacionya.com/sqlserverya/temarios/descripcion.php?cod=152&punto=146&inicio=

    Ya comentas como te va.

    domingo, 25 de noviembre de 2018 21:04