복붙노트

[SQL] 업데이트 트리거 후 SQL 서버

SQL

업데이트 트리거 후 SQL 서버

나는이 트리거에 문제가 있습니다. 나는 요청 된 정보를 업데이트하는 데 싶습니다 유일한 문제의 행 (난 그냥 업데이트 된 것)이 아니라 전체 테이블에.

CREATE TRIGGER [dbo].[after_update] 
    ON [dbo].[MYTABLE]
    AFTER UPDATE
    AS 
    BEGIN
          UPDATE MYTABLE 
          SET mytable.CHANGED_ON = GETDATE(),
          CHANGED_BY=USER_NAME(USER_ID())

어떻게이 단지 문제의 행에 적용되는 트리거를 알 수 있습니까?

해결법

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

    1.여기 내 예는 테스트 이후

    여기 내 예는 테스트 이후

    CREATE TRIGGER [dbo].UpdateTasadoresName 
    ON [dbo].Tasadores  
    FOR  UPDATE
    AS 
          UPDATE Tasadores 
          SET NombreCompleto = RTRIM( Tasadores.Nombre + ' ' + isnull(Tasadores.ApellidoPaterno,'') + ' ' + isnull(Tasadores.ApellidoMaterno,'')    )  
          FROM Tasadores 
        INNER JOIN INSERTED i ON Tasadores.id = i.id
    

    삽입 된 특별한 테이블은 업데이트 된 레코드의 정보를 가지고 있습니다.

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

    2.(하지 업데이트 한 후 갱신)이 시도

    (하지 업데이트 한 후 갱신)이 시도

    CREATE TRIGGER [dbo].[xxx_update] ON [dbo].[MYTABLE]
        FOR UPDATE
        AS
        BEGIN
    
            UPDATE MYTABLE
            SET mytable.CHANGED_ON = GETDATE()
                ,CHANGED_BY = USER_NAME(USER_ID())
            FROM inserted
            WHERE MYTABLE.ID = inserted.ID
    
        END
    
  3. ==============================

    3.그렇게하는 것이 매우 간단합니다 먼저 당신의 희망을 위해 로그를 유지하는 것이 테이블의 복사본을 생성 예를 들어, 당신은 열 SalesOrderID에, 이름, 성, LASTMODIFIED 테이블 dbo.SalesOrder이

    그렇게하는 것이 매우 간단합니다 먼저 당신의 희망을 위해 로그를 유지하는 것이 테이블의 복사본을 생성 예를 들어, 당신은 열 SalesOrderID에, 이름, 성, LASTMODIFIED 테이블 dbo.SalesOrder이

    테이블 archieve 버전이 열 SalesOrderVersionArhieveId와 dbo.SalesOrderVersionArchieve, SalesOrderID에, 이름, 성, LASTMODIFIED해야한다

    여기에 당신이 SalesOrder를 테이블에 트리거를 설정하는 방법입니다

    USE [YOURDB]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:      Karan Dhanu
    -- Create date: <Create Date,,>
    -- Description: <Description,,>
    -- =============================================
    CREATE TRIGGER dbo.[CreateVersionArchiveRow]
       ON  dbo.[SalesOrder]
      AFTER Update
    AS 
    BEGIN
    
        SET NOCOUNT ON;
    INSERT INTO dbo.SalesOrderVersionArchive
    
       SELECT *
       FROM deleted;
    
    END
    

    당신이 판매 주문 테이블에 어떤 변경하면 지금은 당신에게 VersionArchieve 테이블의 변화를 보여줍니다

  4. ==============================

    4.당신은 삽입 된 테이블에 액세스 및 ID 또는 테이블의 기본 키를 검색 할 수 있어야한다. 이 예와 비슷한 뭔가 ...

    당신은 삽입 된 테이블에 액세스 및 ID 또는 테이블의 기본 키를 검색 할 수 있어야한다. 이 예와 비슷한 뭔가 ...

    CREATE TRIGGER [dbo].[after_update] ON [dbo].[MYTABLE]
    AFTER UPDATE AS 
    BEGIN
        DECLARE @id AS INT
        SELECT @id = [IdColumnName]
        FROM INSERTED
    
        UPDATE MYTABLE 
        SET mytable.CHANGED_ON = GETDATE(),
        CHANGED_BY=USER_NAME(USER_ID())
        WHERE [IdColumnName] = @id
    

    트리거를 사용하는 경우 다음 삽입 및 삭제 된 테이블에 대한 MSDN의 링크가 가능한 : http://msdn.microsoft.com/en-au/library/ms191300.aspx

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

    5.이 해결 방법을 시도해보십시오.

    이 해결 방법을 시도해보십시오.

           DECLARE @Id INT
           DECLARE @field VARCHAR(50)
    
           SELECT @Id= INSERTED.CustomerId       
           FROM INSERTED
    
           IF UPDATE(Name)
           BEGIN
                  SET @field = 'Updated Name'
           END
    
           IF UPDATE(Country)
           BEGIN
                  SET @field = 'Updated Country'
           END
    
           INSERT INTO CustomerLogs
           VALUES(@Id, @field)
    
           // OR
           -- If you wish to update existing table records.
           UPDATE YOUR_TABLE SET [FIELD]=[VALUE] WHERE {CONDITION}
    

    나는 SQL 서버의 이전 버전에 이것을 확인하지 않았다 그러나 이것은 SQL 서버 2012와 함께 작동합니다.

  6. ==============================

    6.첫째로, 당신은 이미 참조로 트리거는 테이블의 모든 레코드를 업데이트 할 예정이다. 나타나서 변경된 행을 달성하기 위해 수행 필터는 적용되지 않습니다.

    첫째로, 당신은 이미 참조로 트리거는 테이블의 모든 레코드를 업데이트 할 예정이다. 나타나서 변경된 행을 달성하기 위해 수행 필터는 적용되지 않습니다.

    둘째, 여러 행이 변경 될 수 있습니다로 잘못 일괄 처리 만 한 행 변경을 가정하고 있습니다.

    제대로이 작업을 수행하는 방법은 가상 삽입 및 삭제 테이블을 사용하는 것입니다 : http://msdn.microsoft.com/en-us/library/ms191300.aspx

  7. ==============================

    7.임시 테이블 TESTTEST을 만들려면이 스크립트를 시도하고 트리거가이 순서로 호출 될 때 우선 순위를 시계 : 1) INSTEAD OF, 2)의 경우, 3) AFTER를

    임시 테이블 TESTTEST을 만들려면이 스크립트를 시도하고 트리거가이 순서로 호출 될 때 우선 순위를 시계 : 1) INSTEAD OF, 2)의 경우, 3) AFTER를

    모든 논리 대신 OF 트리거에 배치하고 난 당신이 몇 가지 시나리오를 코딩하는 방법의 2 예를 ...

    행운을 빕니다...

    CREATE TABLE TESTTEST
    (
        ID  INT,
        Modified0 DATETIME,
        Modified1 DATETIME
    )
    GO
    CREATE TRIGGER [dbo].[tr_TESTTEST_0] ON [dbo].TESTTEST
    INSTEAD OF INSERT,UPDATE,DELETE
    AS
    BEGIN
        SELECT 'INSTEAD OF'
        SELECT 'TT0.0'
        SELECT * FROM TESTTEST
    
        SELECT *, 'I' Mode
        INTO #work
        FROM INSERTED
    
        UPDATE #work SET Mode='U' WHERE ID IN (SELECT ID FROM DELETED)
        INSERT INTO #work (ID, Modified0, Modified1, Mode)
        SELECT ID, Modified0, Modified1, 'D'
        FROM DELETED WHERE ID NOT IN (SELECT ID FROM INSERTED)
    
        --Check Security or any other logic to add and remove from #work before processing
        DELETE FROM #work WHERE ID=9 -- because you don't want anyone to edit this id?!?!
        DELETE FROM #work WHERE Mode='D' -- because you don't want anyone to delete any records
    
        SELECT 'EV'
        SELECT * FROM #work
    
        IF(EXISTS(SELECT TOP 1 * FROM #work WHERE Mode='I'))
        BEGIN
            SELECT 'I0.0'
            INSERT INTO dbo.TESTTEST (ID, Modified0, Modified1)
            SELECT ID, Modified0, Modified1
            FROM #work
            WHERE Mode='I'
            SELECT 'Cool stuff would happen here if you had FOR INSERT or AFTER INSERT triggers.'
            SELECT 'I0.1'
        END
    
        IF(EXISTS(SELECT TOP 1 * FROM #work WHERE Mode='D'))
        BEGIN
            SELECT 'D0.0'
            DELETE FROM TESTTEST WHERE ID IN (SELECT ID FROM #work WHERE Mode='D')
            SELECT 'Cool stuff would happen here if you had FOR DELETE or AFTER DELETE triggers.'
            SELECT 'D0.1'
        END
    
        IF(EXISTS(SELECT TOP 1 * FROM #work WHERE Mode='U'))
        BEGIN
            SELECT 'U0.0'
            UPDATE t SET t.Modified0=e.Modified0, t.Modified1=e.Modified1
            FROM dbo.TESTTEST t
            INNER JOIN #work e ON e.ID = t.ID
            WHERE e.Mode='U'
            SELECT 'U0.1'
        END
        DROP TABLE #work
    
        SELECT 'TT0.1'
        SELECT * FROM TESTTEST
    END
    GO
    CREATE TRIGGER [dbo].[tr_TESTTEST_1] ON [dbo].TESTTEST
    FOR UPDATE
    AS
    BEGIN
        SELECT 'FOR UPDATE'
    
        SELECT 'TT1.0'
        SELECT * FROM TESTTEST
    
        SELECT 'I1'
        SELECT * FROM INSERTED
    
        SELECT 'D1'
        SELECT * FROM DELETED
    
        SELECT 'TT1.1'
        SELECT * FROM TESTTEST
    END
    GO
    CREATE TRIGGER [dbo].[tr_TESTTEST_2] ON [dbo].TESTTEST
    AFTER UPDATE
    AS
    BEGIN
        SELECT 'AFTER UPDATE'
    
        SELECT 'TT2.0'
        SELECT * FROM TESTTEST
    
        SELECT 'I2'
        SELECT * FROM INSERTED
    
        SELECT 'D2'
        SELECT * FROM DELETED
    
        SELECT 'TT2.1'
        SELECT * FROM TESTTEST
    END
    GO
    
    SELECT 'Start'
    INSERT INTO TESTTEST (ID, Modified0) VALUES (9, GETDATE())-- not going to insert
    SELECT 'RESTART'
    INSERT INTO TESTTEST (ID, Modified0) VALUES (10, GETDATE())--going to insert
    SELECT 'RESTART'
    UPDATE TESTTEST SET Modified1=GETDATE() WHERE ID=10-- gointo to update
    SELECT 'RESTART'
    DELETE FROM TESTTEST WHERE ID=10-- not going to DELETE
    SELECT 'FINISHED'
    
    SELECT * FROM TESTTEST
    DROP TABLE TESTTEST
    
  8. ==============================

    8.당신은 INSERTED를 호출 할 수 있습니다, SQL Server는 키의 이름 아이디 전에 및 이벤트 occurs.I 후 테이블에 가정을 수정 된 행의 데이터를 캡처 이러한 테이블을 사용하여

    당신은 INSERTED를 호출 할 수 있습니다, SQL Server는 키의 이름 아이디 전에 및 이벤트 occurs.I 후 테이블에 가정을 수정 된 행의 데이터를 캡처 이러한 테이블을 사용하여

    나는 다음과 같은 코드가 당신을 도울 수 있다고 생각

    CREATE TRIGGER [dbo].[after_update]
    ON [dbo].[MYTABLE]
       AFTER UPDATE
    AS
    BEGIN
        UPDATE dbo.[MYTABLE]
        SET    dbo.[MYTABLE].CHANGED_ON = GETDATE(),
               dbo.[MYTABLE].CHANGED_BY = USER_NAME(USER_ID())
        FROM   INSERTED
        WHERE  INSERTED.Id = dbo.[MYTABLE].[Id]
    END
    
  9. ==============================

    9.

    CREATE TRIGGER [dbo].[after_update] ON [dbo].[MYTABLE]
    AFTER UPDATE
    AS
    BEGIN
        DECLARE @ID INT
    
        SELECT @ID = D.ID
        FROM inserted D
    
        UPDATE MYTABLE
        SET mytable.CHANGED_ON = GETDATE()
            ,CHANGED_BY = USER_NAME(USER_ID())
        WHERE ID = @ID
    END
    
  10. from https://stackoverflow.com/questions/25568526/sql-server-after-update-trigger by cc-by-sa and MIT license