SQLite-트리거
SQLite Triggers지정된 데이터베이스 이벤트가 발생할 때 자동으로 수행 / 호출되는 데이터베이스 콜백 함수입니다. 다음은 SQLite 트리거에 대한 중요한 사항입니다.
SQLite 트리거는 특정 데이터베이스 테이블의 DELETE, INSERT 또는 UPDATE가 발생할 때마다 또는 테이블의 하나 이상의 지정된 열에서 UPDATE가 발생할 때마다 실행되도록 지정할 수 있습니다.
현재 SQLite는 FOR EACH STATEMENT 트리거가 아닌 FOR EACH ROW 트리거 만 지원합니다. 따라서 FOR EACH ROW를 명시 적으로 지정하는 것은 선택 사항입니다.
WHEN 절과 트리거 조치 모두 양식의 참조를 사용하여 삽입, 삭제 또는 업데이트되는 행의 요소에 액세스 할 수 있습니다. NEW.column-name 과 OLD.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, DELETE 및 UPDATE 데이터베이스 작업 일 수 있습니다.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;