none
Trigger RRS feed

  • Pregunta

  • Tengo una duda!!!

    Para realizar un trigger que por ejemplo tengo mis 2 tablas 

    CREATE TABLE GRAL_Kpi
    (
    KpiID INT PRIMARY KEY IDENTITY (1,1),
    Name VARCHAR (100) NOT NULL,
    Green VARCHAR (5) NULL,
    TEOA INT NOT NULL,
    PilarID INT CONSTRAINT FK_GRAL_Kpi_GRAL_Pilar FOREIGN KEY (PilarID) REFERENCES GRAL_Pilar (PilarID) NOT NULL,
    ModifyDate VARCHAR (50) NULL,
    ModifyUser VARCHAR (50) NULL
    )

    CREATE TABLE GRAL_Kpi_Det
    (
    KpiDetID INT PRIMARY KEY IDENTITY (1,1),
    KpiSumID INT CONSTRAINT FK_GRAL_Kpi_Det_GRAL_Kpi_Sum FOREIGN KEY (KpiSumID) REFERENCES GRAL_Kpi_Sum (KpiSumID) NOT NULL,
    FY VARCHAR (5) NOT NULL,
    [Date] DATE NULL,
    Period VARCHAR (50) NOT NULL,
    [Target] FLOAT NULL,
    [Current] NVARCHAR (50) NULL
    )

    Lo uq enecesito que cuando inserte un nuevo KPI automaticamente me inserte datos en la de detalle

    sábado, 29 de septiembre de 2018 2:49

Respuestas

  • Hola Oscar956:

    No es recomendable utilizar triggers para insertar registros, tal cual lo solicitas, porque, que ocurre si el trigger falla. Nunca lo sabrás. Y si deja de funcionar por un cambio en la estructura..... existen muchos motivos, pero los más lógicos son, que tu has perdido el control.

    Te pongo las dos soluciones, 1 con procedure y la que debieras de usar, y la 2 con trigger.

    Como tu sentencias de script tienen referencias a tablas que no existen las he tenido que truncar, y puede haber valores, que no sean exactamente como yo he visto. Míralo por si te ayuda.

    CREATE TABLE GRAL_Kpi
     (
     KpiID INT PRIMARY KEY IDENTITY (1,1),
     Name VARCHAR (100) NOT NULL,
     Green VARCHAR (5) NULL,
     TEOA INT NOT NULL,
     PilarID INT  NOT NULL,
     ModifyDate VARCHAR (50) NULL,
     ModifyUser VARCHAR (50) NULL
     )
    
    CREATE TABLE GRAL_Kpi_Det
     (
     KpiDetID INT PRIMARY KEY IDENTITY (1,1),
     KpiSumID INT NOT NULL,
     FY VARCHAR (5) NOT NULL,
     [Date] DATE NULL,
     Period VARCHAR (50) NOT NULL,
     [Target] FLOAT NULL,
     [Current] NVARCHAR (50) NULL
     )
     go
    
    CREATE PROCEDURE sp_Gral_Kpi_Insert
    (@id     INT,
     @name   VARCHAR(100),
     @g      VARCHAR(5),
     @t      INT,
     @pId    INT,
     @Fecha  VARCHAR(50),
     @fecha2 VARCHAR(50)
    )
    AS
        BEGIN TRY
            BEGIN TRAN;
            DECLARE @fechaActual DATETIME;
            INSERT INTO GRAL_Kpi
    (KpiID,
     Name,
     Green,
     TEOA,
     PilarID,
     ModifyDate,
     ModifyUser
    )
            VALUES
    (@id,
     @name,
     @g,
     @t,
     @pId,
     @Fecha,
     @fecha2
    );
            INSERT INTO GRAL_Kpi_Det
    (KpiSumID,
     FY,
     [Date],
     Period,
     [Target],
     [Current]
    )
            VALUES
    (@id,
     @g,
     CAST(@fechaActual AS DATE),
     @fecha,
     0,
     @fecha2
    );
            COMMIT TRAN;
        END TRY
        BEGIN CATCH
            ROLLBACK TRAN;
            THROW;
        END CATCH;
    RETURN;
    go
    create Trigger tr_GralKpi 
    ON dbo.GRAL_Kpi
    AFTER INSERT
    AS
    declare @fecha date = getdaTE();
    INSERT INTO GRAL_Kpi_Det
    SELECT 
    	i.KpiID, i.Green, @fecha, i.ModifyDate, 0, i.ModifyUser
     FROM inserted i;
    return
    
    
    
    
    sábado, 29 de septiembre de 2018 5:51

Todas las respuestas

  • ¿Y porque no lo hace mediante el procedimiento que inserta en la PRIMERA tabla?

    Los triggers no fueron creados para desarrollar la logica de su sistema

    sábado, 29 de septiembre de 2018 3:06
  • Hola Oscar956:

    No es recomendable utilizar triggers para insertar registros, tal cual lo solicitas, porque, que ocurre si el trigger falla. Nunca lo sabrás. Y si deja de funcionar por un cambio en la estructura..... existen muchos motivos, pero los más lógicos son, que tu has perdido el control.

    Te pongo las dos soluciones, 1 con procedure y la que debieras de usar, y la 2 con trigger.

    Como tu sentencias de script tienen referencias a tablas que no existen las he tenido que truncar, y puede haber valores, que no sean exactamente como yo he visto. Míralo por si te ayuda.

    CREATE TABLE GRAL_Kpi
     (
     KpiID INT PRIMARY KEY IDENTITY (1,1),
     Name VARCHAR (100) NOT NULL,
     Green VARCHAR (5) NULL,
     TEOA INT NOT NULL,
     PilarID INT  NOT NULL,
     ModifyDate VARCHAR (50) NULL,
     ModifyUser VARCHAR (50) NULL
     )
    
    CREATE TABLE GRAL_Kpi_Det
     (
     KpiDetID INT PRIMARY KEY IDENTITY (1,1),
     KpiSumID INT NOT NULL,
     FY VARCHAR (5) NOT NULL,
     [Date] DATE NULL,
     Period VARCHAR (50) NOT NULL,
     [Target] FLOAT NULL,
     [Current] NVARCHAR (50) NULL
     )
     go
    
    CREATE PROCEDURE sp_Gral_Kpi_Insert
    (@id     INT,
     @name   VARCHAR(100),
     @g      VARCHAR(5),
     @t      INT,
     @pId    INT,
     @Fecha  VARCHAR(50),
     @fecha2 VARCHAR(50)
    )
    AS
        BEGIN TRY
            BEGIN TRAN;
            DECLARE @fechaActual DATETIME;
            INSERT INTO GRAL_Kpi
    (KpiID,
     Name,
     Green,
     TEOA,
     PilarID,
     ModifyDate,
     ModifyUser
    )
            VALUES
    (@id,
     @name,
     @g,
     @t,
     @pId,
     @Fecha,
     @fecha2
    );
            INSERT INTO GRAL_Kpi_Det
    (KpiSumID,
     FY,
     [Date],
     Period,
     [Target],
     [Current]
    )
            VALUES
    (@id,
     @g,
     CAST(@fechaActual AS DATE),
     @fecha,
     0,
     @fecha2
    );
            COMMIT TRAN;
        END TRY
        BEGIN CATCH
            ROLLBACK TRAN;
            THROW;
        END CATCH;
    RETURN;
    go
    create Trigger tr_GralKpi 
    ON dbo.GRAL_Kpi
    AFTER INSERT
    AS
    declare @fecha date = getdaTE();
    INSERT INTO GRAL_Kpi_Det
    SELECT 
    	i.KpiID, i.Green, @fecha, i.ModifyDate, 0, i.ModifyUser
     FROM inserted i;
    return
    
    
    
    
    sábado, 29 de septiembre de 2018 5:51