SQLite-트리거

SQLite Triggers지정된 데이터베이스 이벤트가 발생할 때 자동으로 수행 / 호출되는 데이터베이스 콜백 함수입니다. 다음은 SQLite 트리거에 대한 중요한 사항입니다.

  • SQLite 트리거는 특정 데이터베이스 테이블의 DELETE, INSERT 또는 UPDATE가 발생할 때마다 또는 테이블의 하나 이상의 지정된 열에서 UPDATE가 발생할 때마다 실행되도록 지정할 수 있습니다.

  • 현재 SQLite는 FOR EACH STATEMENT 트리거가 아닌 FOR EACH ROW 트리거 만 지원합니다. 따라서 FOR EACH ROW를 명시 적으로 지정하는 것은 선택 사항입니다.

  • WHEN 절과 트리거 조치 모두 양식의 참조를 사용하여 삽입, 삭제 또는 업데이트되는 행의 요소에 액세스 할 수 있습니다. NEW.column-nameOLD.column-name여기서 column-name은 트리거가 연결된 테이블의 열 이름입니다.

  • WHEN 절이 제공되면 지정된 SQL 문은 WHEN 절이 참인 행에 대해서만 실행됩니다. WHEN 절이 제공되지 않으면 모든 행에 대해 SQL 문이 실행됩니다.

  • BEFORE 또는 AFTER 키워드는 연관된 행의 삽입, 수정 또는 제거와 관련하여 트리거 조치가 실행되는시기를 결정합니다.

  • 트리거는 연관된 테이블이 삭제 될 때 자동으로 삭제됩니다.

  • 수정할 테이블은 트리거가 연결된 테이블 또는 뷰와 동일한 데이터베이스에 있어야하며 tablename 아니 database.tablename.

  • 예외를 발생시키기 위해 트리거 프로그램 내에서 특수 SQL 함수 RAISE ()를 사용할 수 있습니다.

통사론

다음은 생성하는 기본 구문입니다. trigger.

CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- Trigger logic goes here....
END;

여기, event_name언급 된 테이블에 대한 INSERT, DELETEUPDATE 데이터베이스 작업 수 있습니다.table_name. 선택적으로 테이블 이름 뒤에 FOR EACH ROW를 지정할 수 있습니다.

다음은 테이블의 하나 이상의 지정된 열에서 UPDATE 작업에 대한 트리거를 생성하는 구문입니다.

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
   -- Trigger logic goes here....
END;

다음과 같이 새로 생성하는 COMPANY 테이블에 삽입되는 모든 레코드에 대해 감사 시도를 유지하려는 경우를 고려해 보겠습니다 (이미 가지고있는 경우 COMPANY 테이블 삭제).

sqlite> CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

감사 시도를 계속하기 위해 새 레코드에 대한 COMPANY 테이블에 항목이있을 때마다 로그 메시지가 삽입 될 AUDIT라는 새 테이블을 만듭니다.

sqlite> CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

여기서 ID는 AUDIT 레코드 ID이고 EMP_ID는 COMPANY 테이블에서 가져올 ID이며 DATE는 레코드가 COMPANY 테이블에 생성 될 때 타임 스탬프를 유지합니다. 이제 다음과 같이 COMPANY 테이블에 트리거를 생성 해 보겠습니다.

sqlite> CREATE TRIGGER audit_log AFTER INSERT 
ON COMPANY
BEGIN
   INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;

이제 실제 작업을 시작하겠습니다. COMPANY 테이블에 레코드 삽입을 시작합니다. 그러면 AUDIT 테이블에 감사 로그 레코드가 생성됩니다. 다음과 같이 COMPANY 테이블에 하나의 레코드를 만듭니다.

sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

이렇게하면 COMPANY 테이블에 다음과 같은 하나의 레코드가 생성됩니다.

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0

동시에 AUDIT 테이블에 하나의 레코드가 생성됩니다. 이 레코드는 COMPANY 테이블의 INSERT 연산에서 생성 한 트리거의 결과입니다. 마찬가지로 요구 사항에 따라 UPDATE 및 DELETE 작업에 대한 트리거를 만들 수 있습니다.

EMP_ID      ENTRY_DATE
----------  -------------------
1           2013-04-05 06:26:00

트리거 나열

모든 트리거를 나열 할 수 있습니다. sqlite_master 다음과 같이 표-

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';

위의 SQLite 문은 다음과 같이 하나의 항목 만 나열합니다.

name
----------
audit_log

특정 테이블에 대한 트리거를 나열하려면 다음과 같이 테이블 이름과 함께 AND 절을 사용하십시오.

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';

위의 SQLite 문은 다음과 같이 하나의 항목 만 나열합니다.

name
----------
audit_log

트리거 삭제

다음은 기존 트리거를 삭제하는 데 사용할 수있는 DROP 명령입니다.

sqlite> DROP TRIGGER trigger_name;