복붙노트

[SQL] 어떻게 재귀에서 데이터베이스 트리거를 방지합니까?

SQL

어떻게 재귀에서 데이터베이스 트리거를 방지합니까?

나는 SQL 서버 2008 데이터베이스의 테이블에 다음 트리거를 가지고있다. 나는 그것을 중지해야하므로 그것은, 재귀입니다.

나는 레코드를 삽입하거나 업데이트 후, 나는 단순히 테이블에 하나의 필드를 업데이트하기 위해 노력하고있어.

다음 트리거는 다음과 같습니다

ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate] 
   ON  [dbo].[tblMedia]
   BEFORE INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON

    DECLARE @IdMedia INTEGER,
        @NewSubject NVARCHAR(200)   

    SELECT @IdMedia = IdMedia, @NewSubject = Title
    FROM INSERTED

    -- Now update the unique subject field.
    -- NOTE: dbo.CreateUniqueSubject is my own function. 
    --       It just does some string manipulation.
    UPDATE tblMedia
    SET UniqueTitle = dbo.CreateUniqueSubject(@NewSubject) + 
                      CAST((IdMedia) AS VARCHAR(10))
    WHERE tblMedia.IdMedia = @IdMedia
END

아무도 내가 다시는 트리거를 발로에서 트리거의 삽입을 방지 할 수있는 방법을 말해 줄래?

해결법

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

    1.그것은 더 이상 OP의 질문에 관련의 확실하지 경우,하지만 경우에 당신은 당신과 같이이 테스트 할 수 있습니다, 트리거에서 일어나는에서 재귀 또는 상호 재귀를 방지하는 방법을 찾기 위해 여기 온 :

    그것은 더 이상 OP의 질문에 관련의 확실하지 경우,하지만 경우에 당신은 당신과 같이이 테스트 할 수 있습니다, 트리거에서 일어나는에서 재귀 또는 상호 재귀를 방지하는 방법을 찾기 위해 여기 온 :

    IF TRIGGER_NESTLEVEL() <= 1/*this update is not coming from some other trigger*/
    

    MSDN 링크

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

    2.나는 세 가지 가능성을 참조하십시오

    나는 세 가지 가능성을 참조하십시오

  3. ==============================

    3.

    ALTER DATABASE <dbname> SET RECURSIVE_TRIGGERS OFF
    
  4. ==============================

    4.TRIGGER_NESTLEVEL 특정 트리거의 순환을 방지하는 데 사용될 수 있지만,이 기능으로 트리거의 오브젝트 ID를 전달하는 것이 중요하다. 그렇지 않으면 당신은 또한 삽입 또는 업데이트가 다른 트리거에 의해 만들어 질 때 발사에서 트리거를 방지 할 수 있습니다 :

    TRIGGER_NESTLEVEL 특정 트리거의 순환을 방지하는 데 사용될 수 있지만,이 기능으로 트리거의 오브젝트 ID를 전달하는 것이 중요하다. 그렇지 않으면 당신은 또한 삽입 또는 업데이트가 다른 트리거에 의해 만들어 질 때 발사에서 트리거를 방지 할 수 있습니다 :

       IF TRIGGER_NESTLEVEL(OBJECT_ID('dbo.mytrigger')) > 1
             BEGIN
                 PRINT 'mytrigger exiting because TRIGGER_NESTLEVEL > 1 ';
                 RETURN;
         END;
    

    MSDN에서 :

    참고: 재귀 트리거를 방지

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

    5.나는 그것을 거 같아요 :)

    나는 그것을 거 같아요 :)

    제목 (읽기 : 삽입 또는 업데이트) '업데이트'지고 때, 독특한 주제를 업데이트합니다. 트리거가 두 번째로 실행됩니다 때 트리거를 중지하고 잎 있도록 uniquesubject 필드는 업데이트지고 있습니다.

    또한, 나는이 바뀌지 여러 행을 처리했습니다 -> 난 항상 트리거와이 잊어.

    ALTER TRIGGER [dbo].[tblMediaAfterInsert] 
       ON  [dbo].[tblMedia]
       FOR INSERT, UPDATE
    AS 
    BEGIN
        SET NOCOUNT ON
    
        -- If the Title is getting inserted OR updated then update the unique subject.
        IF UPDATE(Title) BEGIN
            -- Now update all the unique subject fields that have been inserted or updated.
            UPDATE tblMedia 
            SET UniqueTitle = dbo.CreateUniqueSubject(b.Title) + 
                              CAST((b.IdMedia) AS VARCHAR(10))
            FROM tblMedia a
                INNER JOIN INSERTED b on a.IdMedia = b.IdMedia
        END
    END
    
  6. ==============================

    6.당신은 UniqueTitle이 설정되어 있는지 여부를 나타내는 별도의 NULLABLE 컬럼을 가질 수 있습니다.

    당신은 UniqueTitle이 설정되어 있는지 여부를 나타내는 별도의 NULLABLE 컬럼을 가질 수 있습니다.

    그것의 값이 "삽입 한"에 해당하는 경우 아무것도하지 않고 트리거에서 진정한 가치로 설정하고, 트리거를

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

    7.완전성을 위해, 나는 몇 가지를 추가합니다. 당신이 한 번만 실행하려는 당신이 트리거 후 특정이있는 경우, 당신은 마지막으로 사용 sp_settriggerorder를 실행하도록 설정할 수 있습니다.

    완전성을 위해, 나는 몇 가지를 추가합니다. 당신이 한 번만 실행하려는 당신이 트리거 후 특정이있는 경우, 당신은 마지막으로 사용 sp_settriggerorder를 실행하도록 설정할 수 있습니다.

    가 하나의 트리거로 재귀를하고있는 트리거를 결합하는 것이 가장하지 않을 수 있다면 나 또한 고려할 것입니다.

  8. from https://stackoverflow.com/questions/1529412/how-do-i-prevent-a-database-trigger-from-recursing by cc-by-sa and MIT license