>데이터 베이스 >MySQL 튜토리얼 >SQL Server에서 재귀 트리거를 방지하려면 어떻게 해야 합니까?

SQL Server에서 재귀 트리거를 방지하려면 어떻게 해야 합니까?

DDD
DDD원래의
2024-12-31 14:19:14623검색

How Can I Prevent Recursive Triggers in SQL Server?

SQL Server에서 재귀 트리거 방지

SQL Server 2008에서 tblMedia 테이블의 트리거 [dbo].[tblMediaAfterInsertOrUpdate]가 실수로 재귀 동작을 유발합니다. 이 동작은 트리거가 트리거된 후 자체적으로 트리거될 때 발생합니다.

문제를 이해하려면 트리거를 살펴보겠습니다.

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

삽입 또는 업데이트 후: 삽입 또는 업데이트가 커밋되기 전에 트리거가 실행됩니다.

재귀 가능성: 트리거 내부의 업데이트 문은 tblMedia 테이블을 수정하려고 시도합니다. 이 수정으로 인해 동일한 트리거가 다시 트리거되어 무한 루프가 발생할 수 있습니다.

재귀 방지: 이러한 재귀 동작을 방지하려면 TRIGGER_NESTLEVEL() 함수를 사용하여 중첩 수준을 확인할 수 있습니다. 방아쇠의. 중첩 수준이 1보다 큰 경우 트리거는 다른 트리거에 의해 호출되므로 건너뛰어야 합니다.

ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate]
ON [dbo].[tblMedia]
BEFORE INSERT, UPDATE
AS
BEGIN
    IF TRIGGER_NESTLEVEL() <= 1 /* Prevent recursion */
    BEGIN
        ...
    END
END

설명:

  • TRIGGER_NESTLEVEL () 함수는 중첩된 트리거 레벨의 수를 반환합니다. 현재 트리거가 가장 바깥쪽 트리거(첫 번째 실행)인 경우 중첩 수준은 1이 됩니다.
  • 중첩 수준이 1보다 큰 경우 해당 트리거는 다른 트리거에 의해 호출되고 있으므로 건너뛰어야 합니다.
  • 중첩 수준이 1이면 트리거가 재귀적으로 호출되지 않으며 정상적인 작업을 진행할 수 있습니다.

이 검사를 트리거에 통합함으로써 무한 반복을 방지하고 필요한 데이터 수정이 한 번만 수행되도록 보장합니다.

위 내용은 SQL Server에서 재귀 트리거를 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.