SQL update триггер только при изменении столбца


глядя на другие примеры, я придумал следующее, Но он, похоже, не работает так, как мне хотелось бы: я хочу, чтобы он обновлял только измененную информацию, если QtyToRepair значение было обновлено... но этого не происходит.

Если я закомментирую, где тогда измененная информация обновляется в каждом случае. Как я уже сказал, другие примеры заставили меня быть оптимистом. Любые подсказки оценены. Спасибо.

Уолтер

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE SCHEDULE SET modified = GETDATE()
        , ModifiedUser = SUSER_NAME()
        , ModifiedHost = HOST_NAME()
    FROM SCHEDULE S
    INNER JOIN Inserted I on S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
    WHERE S.QtyToRepair <> I.QtyToRepair
END
5 79

5 ответов:

у вас есть два пути на ваш вопрос :

1-используйте команду обновления в триггере.

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;
    IF UPDATE (QtyToRepair) 
    BEGIN
        UPDATE SCHEDULE 
        SET modified = GETDATE()
           , ModifiedUser = SUSER_NAME()
           , ModifiedHost = HOST_NAME()
        FROM SCHEDULE S INNER JOIN Inserted I 
        ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
        WHERE S.QtyToRepair <> I.QtyToRepair
    END 
END

2-используйте соединение между вставленной таблицей и удаленной таблицей

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;    

    UPDATE SCHEDULE 
    SET modified = GETDATE()
       , ModifiedUser = SUSER_NAME()
       , ModifiedHost = HOST_NAME()
    FROM SCHEDULE S 
    INNER JOIN Inserted I ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
    INNER JOIN Deleted D ON S.OrderNo = D.OrderNo and S.PartNumber = D.PartNumber                  
    WHERE S.QtyToRepair <> I.QtyToRepair
    AND D.QtyToRepair <> I.QtyToRepair
END

при использовании команды Update для таблицы SCHEDULE и set QtyToRepair столбец для нового значения, если новое значение равно старому значению в одной или нескольких строках, Решение 1 обновляет все обновленные строки в таблице расписания, но решение 2 обновляет только строки расписания, которые старое значение не равно новому значению.

fyi код, который я получил:

IF UPDATE (QtyToRepair)
    begin
        INSERT INTO tmpQtyToRepairChanges (OrderNo, PartNumber, ModifiedDate, ModifiedUser, ModifiedHost, QtyToRepairOld, QtyToRepairNew)
        SELECT S.OrderNo, S.PartNumber, GETDATE(), SUSER_NAME(), HOST_NAME(), D.QtyToRepair, I.QtyToRepair FROM SCHEDULE S
        INNER JOIN Inserted I ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
        INNER JOIN Deleted D ON S.OrderNo = D.OrderNo and S.PartNumber = D.PartNumber 
        WHERE I.QtyToRepair <> D.QtyToRepair
end

нужно проверить, если QtyToRepair сначала обновляется.

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;
    IF UPDATE (QtyToRepair) 
    BEGIN
        UPDATE SCHEDULE 
        SET modified = GETDATE()
           , ModifiedUser = SUSER_NAME()
           , ModifiedHost = HOST_NAME()
        FROM SCHEDULE S INNER JOIN Inserted I 
            ON S.OrderNo = I.OrderNo and S.PartNumber =    I.PartNumber
        WHERE S.QtyToRepair <> I.QtyToRepair
    END
END

вы хотите сделать следующее:

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;

    IF (UPDATE(QtyToRepair))
    BEGIN
        UPDATE SCHEDULE SET modified = GETDATE()
            , ModifiedUser = SUSER_NAME()
            , ModifiedHost = HOST_NAME()
        FROM SCHEDULE S
        INNER JOIN Inserted I ON S.OrderNo = I.OrderNo AND S.PartNumber = I.PartNumber
        WHERE S.QtyToRepair <> I.QtyToRepair
    END
END

обратите внимание, что этот триггер будет срабатывать каждый раз при обновлении столбца независимо от того, является ли значение одинаковым или нет.

Я получил самое простое мышление концепция всякий раз, когда запись обновляется запись удаляется.

вот мой пример

ALTER TRIGGER [dbo].[UpdatePhyDate] На на [dbo].[M_ContractDT1] ПОСЛЕ ОБНОВЛЕНИЯ КАК НАЧИНАТЬ -- на ContarctDT1 PhyQty обновляется -- Я хочу, чтобы системная дата в фитат автоматически сохраняются УСТАНОВИТЕ NOCOUNT НА;

declare @dt1ky as int   

if(update(Phyqty))
begin
    select @dt1ky = dt1ky from deleted

    update M_ContractDT1 set PhyDate=GETDATE() where Dt1Ky=  @dt1ky     

end

конец

Он работает