복붙노트

[SQL] 열이 수정 SQL 업데이트 트리거 만

SQL

열이 수정 SQL 업데이트 트리거 만

다른 예를 살펴보면 나는 다음을 마련했지만 내가 원하는대로 작동하지 않는 것 : 나는 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

해결법

  1. ==============================

    1.당신은 당신의 질문에 대한 두 가지 방법이있다 :

    당신은 당신의 질문에 대한 두 가지 방법이있다 :

    당신의 트리거에서 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
    

    새 값이 하나 또는 다중 행, 솔루션 1 업데이트 스케줄 표하지만 솔루션 2 만 업데이트 일정 행 이전 값과 같지 않은 점에서 업데이트 된 모든 행의 이전 값과 동일한 경우 테이블 일정과 새로운 값으로 설정 QtyToRepair 열, 업데이트 명령을 사용할 때 새로운 값.

  2. ==============================

    2.참고하시기 바랍니다 코드 내가 함께 결국 :

    참고하시기 바랍니다 코드 내가 함께 결국 :

    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
    
  3. ==============================

    3.QtyToRepair 처음에 업데이트되는 경우 하나 확인해야합니다.

    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
    
  4. ==============================

    4.당신은 다음을 수행 할 :

    당신은 다음을 수행 할 :

    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
    

    이 트리거 값이 동일인지 아닌지에 상관없이 열을 업데이트하지 때마다 발생되므로주의하시기 바랍니다.

  5. ==============================

    5.레코드가 레코드가되어 업데이트 될 때마다 "삭제". 여기 내 예입니다 :

    레코드가 레코드가되어 업데이트 될 때마다 "삭제". 여기 내 예입니다 :

    ALTER TRIGGER [dbo].[UpdatePhyDate]
       ON  [dbo].[M_ContractDT1]
       AFTER UPDATE
    AS 
    BEGIN
        -- on ContarctDT1 PhyQty is updated 
        -- I want system date in Phytate automatically saved
        SET NOCOUNT ON;
    
        declare @dt1ky as int   
    
        if(update(Phyqty))
        begin
            select @dt1ky = dt1ky from deleted
    
            update M_ContractDT1 set PhyDate=GETDATE() where Dt1Ky=  @dt1ky     
    
        end
    
    END
    

    그것은 잘 작동합니다

  6. from https://stackoverflow.com/questions/12137102/sql-update-trigger-only-when-column-is-modified by cc-by-sa and MIT license