복붙노트

[SQL] 문 수준 트리거 대 행 수준 트리거

SQL

문 수준 트리거 대 행 수준 트리거

나는 '행 수준 트리거'와 '문 수준 트리거'의 차이를 이해하는 힘든 시간을 보내고 있어요.

나의 이해에서, 시나리오에서 명령문 레벨 트리거는 전체 테이블이 수정 될 수 있습니다 만들 수 있습니다. 나만이 튜플의 존재를 수정할 수 있도록 할 행 레벨 트리거는 트리거의를, 지정된 이벤트에 의해 영향을 미친다.

이 올바른지? 사람이 두 가지의 예를 가지고 있습니까?

감사!

해결법

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

    1.주요 차이점은 DBMS에 따라 트리거에 의해 수정 될 수 있습니다 것이 아니다. 트리거 (행 또는 문 수준) 하나를 수정하거나 여러 행이 아니라 동일하거나 다른 테이블의, * 및 계단식 효과 (트리거 다른 작업 / 트리거)를 가질 수 있지만,이 모든 코스의 DBMS에 따라 달라집니다.

    주요 차이점은 DBMS에 따라 트리거에 의해 수정 될 수 있습니다 것이 아니다. 트리거 (행 또는 문 수준) 하나를 수정하거나 여러 행이 아니라 동일하거나 다른 테이블의, * 및 계단식 효과 (트리거 다른 작업 / 트리거)를 가질 수 있지만,이 모든 코스의 DBMS에 따라 달라집니다.

    가장 큰 차이점은 트리거가 활성화 횟수입니다. 상상 당신은 1M 행 테이블이 있고 실행 :

    UPDATE t
    SET columnX = columnX + 1
    

    성명 수준의 트리거는 한 번 활성화됩니다 (더 행이 업데이트되지 않은 경우에도). 행 레벨 트리거마다 한 번씩 업데이트 된 행에 대해, 만 번을 활성화됩니다.

    또 다른 차이점은 순서 또는 활성화입니다. 오라클의 예를 들어 트리거의 4 개 가지 유형은 다음과 같은 순서로 활성화됩니다 :

    Before the triggering statement executes
    Before each row that the triggering statement affects
    After each row that the triggering statement affects
    After the triggering statement executes
    

    앞의 예에서, 우리는 뭔가를 같은 거라고 :

    Before statement-level trigger executes
    
      Before row-level trigger executes
      One row is updated
      After row-level trigger executes
    
      Before row-level trigger executes
      Second row is updated
      After row-level trigger executes
    
      ...
    
      Before row-level trigger executes
      Millionth row is updated
      After row-level trigger executes
    
    After statement-level trigger executes
    

    추가

    다른 DBMS는 DBMS의 특정 구현이나 트리거에 따라, 이것에 다른 제한이있다 : * 행 트리거에 의해 수정 될 수 있는지에. 예를 들어, 오라클은 예를 들어, 어떤 경우에 대한 "돌연변이 테이블"오류가 표시 될 수 있습니다 경우 전체 테이블로부터 행 레벨 트리거 선택 (SELECT MAX TABLENAME FROM (COL)) 또는 다른 행 또는 전체 테이블로 /로부터 트리거 관련된 행을 단지 수정하는 경우.

    그것의 변화를 유발하고 그것은 매우 일반적인 사용 인 행을 수정 완벽하게 (오라클 또는 다른) 행 레벨 트리거 물론 유효합니다. dbfiddle.uk에서 예.

    다른 DBMS는 트리거의 종류가 제공됩니다 어떤 경우에도 다른 트리거의 모든 유형이 무엇을 할 수 있는지에 대한 제한 및 (일부 트리거하기 전에이없는 예를 들어, 일부 등 모두에서 문 수준 트리거가없는)있을 수 있습니다.

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

    2.당신은 트리거 조치가 클라이언트가 문을 실행 한 후 한 번 실행할 수 수정 만 행 (문 수준 트리거). 또는, 당신은 수정 될 때마다 행 (행 레벨 트리거)에 대한 한 번 액션을 트리거 할 수 있습니다.

    당신은 트리거 조치가 클라이언트가 문을 실행 한 후 한 번 실행할 수 수정 만 행 (문 수준 트리거). 또는, 당신은 수정 될 때마다 행 (행 레벨 트리거)에 대한 한 번 액션을 트리거 할 수 있습니다.

    예 :하자가 확실 모든 고 3 졸업을하는 트리거를 말한다. 의 수석 등급이 12 인 경우 즉, 우리는 우리가 NULL로 등급을 설정하려면, 13로 증가.

    문장 레벨 트리거의 경우, 증가 등급의 문을 실행 한 후, NULL로 등급 13 어떤 nows를 업데이트 한 번 전체 테이블을 확인 말하고 싶지만.

    행 수준 트리거의 경우는 13 인 경우 업데이트 될 때마다 행이 NULL로 새 행의 등급을 업데이트 한 후,라고 말하고 싶지만.

    성명 레벨 트리거는 다음과 같이 보일 것이다 :

    create trigger stmt_level_trigger
    after update on Highschooler
    begin
        update Highschooler
        set grade = NULL
        where grade = 13;
    end;
    

    와 행 레벨 트리거는 다음과 같이 보일 것이다 :

    create trigger row_level_trigger
    after update on Highschooler
    for each row
    when New.grade = 13
    begin
        update Highschooler
        set grade = NULL
        where New.ID = Highschooler.ID;
    end;
    

    SQLite는 문 수준 트리거를 지원하지 않습니다, 그래서 SQLite는에, 각 행은 선택 사항입니다.

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

    3.문장 레벨 트리거의 주요 차이점은 다음과 같습니다 :

    문장 레벨 트리거의 주요 차이점은 다음과 같습니다 :

    문장 레벨 트리거 : 어떤 문이 실행될 경우 이름에 따라, 그것은 작동합니다. 한 번만이 실행을 effected.It 얼마나 많은 행 또는 모든 행에 의존하지 않습니다. 특급 : 당신이 부서 HR에서 모든 직원의 업데이트 급여와 말하려면 당신은 많은 GOT 급여 후 사용 문 수준 트리거를 증가하는 방법 수단을 영향을받을 행 수를 알고 싶어요. 트리거는 명령문이 실행 된 경우 문 수준 트리거가 호출이기 때문에 제로 행이 업데이트됩니다 경우에도 실행되므로주의하시기 바랍니다. 이 모든 행에 영향을 주거나하지 않는 경우 없음은 중요하지 않습니다.

    행 레벨 트리거 :는 열 영향 때마다 실행한다. 유 부서 HR이며, u는 즉시 직원이 emp 테이블에서에 의해 감소한다 HR 섹션에서 부서 테이블의 수를 삭제로 사용할 emp 테이블에서 하나 employye을 삭제하려면 제로 열 경우 affected.no 행 레벨 트리거는 execute.suppose합니다 1.then 당신은 행 레벨 트리거를 선택해야한다.

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

    4.문장 레벨 트리거는 leval 트리거가 DML 문에 대해 각 행에 대해입니다 DML 문 행에 대해 한 번만입니다

    문장 레벨 트리거는 leval 트리거가 DML 문에 대해 각 행에 대해입니다 DML 문 행에 대해 한 번만입니다

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

    5.행의 수를 수정할 때이 문을 실행하려면 다음 문 레벨 트리거가 가능 할 수 있습니다 .. 당신이 당신의 문 행의 전화 번호에 대한 각각의 수정을 실행하고자 할 때 viseversa은 ... 당신은 행 레벨 트리거에 갈 필요가 ..

    행의 수를 수정할 때이 문을 실행하려면 다음 문 레벨 트리거가 가능 할 수 있습니다 .. 당신이 당신의 문 행의 전화 번호에 대한 각각의 수정을 실행하고자 할 때 viseversa은 ... 당신은 행 레벨 트리거에 갈 필요가 ..

    예를 들면 : 테이블 레코드의 많은 수를 modified..then시에 문 레벨 트리거 작업이 영향을 받는다. 와 행 레벨 트리거는 각 행의 그 갱신 또는 수정하는 경우 작동 ..

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

    6.1) 행 레벨 트리거 삽입, 업데이트 또는 삭제 등의 행 세트 동작을 수행하는 데 사용

    1) 행 레벨 트리거 삽입, 업데이트 또는 삭제 등의 행 세트 동작을 수행하는 데 사용

    예 : - 당신은 삭제 된 행이 또한 감사 목적을 위해 새 테이블에 삽입해야 함을 동시에 행 세트를 삭제해야한다;

    2) 문장 레벨 트리거 : - 그것은 일반적으로 수행중인 이벤트에 부과 된 제한하는 데 사용됩니다.

    예 : - 오후 10 시부 터 오전 6시 사이의 데이터를 삭제하는 제한;

    도움이 되었기를 바랍니다:)

  7. from https://stackoverflow.com/questions/10167346/row-level-trigger-vs-statement-level-trigger by cc-by-sa and MIT license