영향을받는 행이 없어도 트리거 트리거


10

이것은 일반적인 질문이지만이 질문에 대한 동기는 SQL Server를 사용하는 동안 직면 한 문제였습니다.

행이 삽입되지 않은 경우 부작용으로 오류가 발생하는 일부 논리가 포함 된 테이블의 Insert 이벤트에이 트리거를 연결했습니다. 추가 조사 결과, 행을 삽입하지 않아도 트리거가 실행되고 있음을 발견했습니다.

DML 트리거 에 대한 Microsoft 문서에서 사용되는 언어는 이 동작과 모순되는 것 같습니다.

DML 트리거는 트리거에 정의 된 테이블 또는 뷰에 영향을주는 DML 이벤트가 발생할 때 자동으로 적용되는 특수한 유형의 저장 프로 시저입니다.

이것이 DBMS의 기본 동작입니까? 영향을받는 행이 없을 때 트리거를 발생시키는 특별한 이유가 있습니까?

답변:


24

DML 작업의 경우 행 기반 및 명령문 기반 트리거가 있습니다.

  • 각 행에 영향을 미치거나 (삽입 / 업데이트 / 삭제) 행 트리거가 발생합니다 (이전, 이후 또는 대신). 따라서 100 개의 행이 영향을받는 경우 100 번 실행되고 0 개의 행이 영향을받는 경우 전혀 발생하지 않습니다.

  • INSERT / UPDATE / DELETE명령문이 실행될 때 명령문 트리거가 발생합니다 . 영향을받는 행이 없는지 여부는 중요하지 않습니다. 명령문 레벨 트리거는 어쨌든 한 번만 실행됩니다 (0, 1 천 또는 10 억 행에 영향을 받음).

일부 DBMS에는 행 수준 트리거 (MySQL) 만 있습니다.

다른 사용자 (예 : DBMS 인 SQL Server * )는 명령문 레벨 트리거 만 있습니다.

다른 일부 (DB2, Oracle, Postgres)에는 두 종류의 트리거가 있습니다.


* SQL Server CREATE TRIGGER문서 상태 :

사용자가 DML (데이터 조작 언어) 이벤트를 통해 데이터를 수정하려고하면 DML 트리거가 실행됩니다. DML 이벤트는 INSERT, UPDATE또는 DELETE테이블 또는 뷰에 대한 문. 이 트리거는 테이블 행의 영향 여부에 관계없이 유효한 이벤트가 발생하면 시작됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.