English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLite 트리거(트리거)

SQLite 트리거는 데이터베이스 콜백 함수로, 지정된 데이터베이스 이벤트가 발생할 때 자동으로 실행됩니다/이 함수들을 호출합니다. SQLite 트리거에 대한 주요 사항은 다음과 같습니다-

  • SQLite 트리거(트리거)는 특정 데이터베이스 테이블에서 DELETE, INSERT 또는 UPDATE가 발생할 때나, 하나 또는 여러 개의 지정된 테이블의 열이 업데이트될 때 트리거를 발생시킬 수 있습니다.

  • SQLite은 FOR EACH ROW 트리거(트리거)만 지원하며, FOR EACH STATEMENT 트리거(트리거)는 없습니다. 따라서 FOR EACH ROW를 명확히 지정하는 것은 선택사항입니다.

  • WHEN 절과 트리거(Trigger) 액션은 사용할 수 있는 형식을 통해 접근할 수 있습니다. NEW.column-name 또는 OLD.column-name 참조插入、删除或更新的行元素,其中 column-name은 트리거와 관련된 테이블의 열 이름입니다.

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

  • BEFORE 또는 AFTER 키워드는 트리거 액션을 언제 실행할지 결정합니다. 이는 관련 행의 삽입, 수정 또는 제거 전 또는 후에 트리거 액션을 실행하는지 결정합니다.

  • 트리거와 관련된 테이블이 제거될 때, 자동으로 트리거(Trigger)가 제거됩니다.

  • 수정할 테이블은 트리거가 추가된 테이블이나 뷰와 같은 동일한 데이터베이스에 존재해야 하며, 트리거가 추가된 테이블이나 뷰로만 사용해야 합니다. tablename와 대신 database.tablename

  • 특수 SQL 함수 RAISE()는 트리거 프로그램 내에서 예외를 표출할 수 있습니다.

문법

트리거를 생성하는 기본 문법은 다음과 같습니다.

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- 트리거 로직....
END;

여기서는,event_name위의 테이블에 대한INSERT, DELETE또는UPDATE데이터베이스 작업table_name。테이블 이름 뒤에 FOR EACH ROW를 지정할 수 있습니다.

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

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
   -- 트리거 로직은 여기서....
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;