트리거 생성
트리거를 생성하려면 SQL Developer 그래픽 인터페이스나 DDL 문인 CREATE TRIGGER를 사용합니다.
이 절에서는 트리거를 생성하는 두 가지 방법을 모두 사용하는 방법을 보여줍니다.
기본적으로 트리거는 사용으로 설정된 상태로 생성됩니다. 사용 안함으로 설정된 상태로 트리거를 생성하려면 DISABLE 문에 CREATE TRIGGER 절을 사용합니다.
주: 트리거를 생성하려면 적절한 권한이 있어야 하지만 이 설명과 간단한 응용 프로그램에는 이러한 추가 정보가 필요하지 않습니다.
주: 이 문서의 자습서를 수행하려면 SQL Developer에서 사용자 HR로 Oracle Database에 접속되어 있어야 합니다.
참조:
-
CREATE TRIGGER 문에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference를 참조하십시오
OLD 및 NEW 의사 레코드 정보
행 레벨 트리거가 실행되면 PL/SQL 런타임 시스템에서 두 개의 의사 레코드인 OLD와 NEW를 생성하고 채웁니다. 두 레코드는 레코드의 일부 속성만 있기 때문에 의사 레코드라고 합니다.
트리거가 처리하는 행에서 다음과 같은 결과가 나타납니다.
-
INSERT 트리거의 경우 OLD에는 값이 포함되지 않고 NEW에는 새 값이 포함됩니다.
-
UPDATE 트리거의 경우 OLD에는 이전 값이 포함되고 NEW에는 새 값이 포함됩니다.
-
DELETE 트리거의 경우 OLD에는 이전 값이 포함되고 NEW에는 값이 포함되지 않습니다.
의사 코드를 참조하려면 예제 6-1과 같은 이름 앞에 콜론을 넣습니다(예: OLD 또는 :NEW).
참조: OLD 및 NEW 의사 코드에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference
자습서: 테이블 변경 사항을 기록하는 트리거 생성
이 자습서에서는 CREATE TRIGGER 문을 사용하여 INSERT, UPDATE 또는 DELETE 문이 EVALUATIONS 테이블을 변경할 때마다 EVALUATIONS_LOG 테이블에 행을 추가하는 EVAL_CHANGE_TRIGGER 트리거를 생성하는 방법을 보여줍니다.
트리거 명령문이 실행된 후에 행이 추가되며, 트리거는 조건부 술어 INSERTING , UPDATING 및 DELETING을 사용해서 세 가지 가능한 DML 문 중에서 트리거를 발생시킨 명령문을 확인합니다.
EVAL_CHANGE_TRIGGER는 명령문 레벨 트리거이자 AFTER 트리거입니다.
EVALUATIONS_LOG 및 EVAL_CHANGE_TRIGGER를 생성하려면 다음과 같이 하십시오.
-
EVALUATIONS_LOG 테이블을 생성합니다.
CREATE TABLE EVALUATIONS_LOG ( log_date DATE , action VARCHAR2(50)); -
EVAL_CHANGE_TRIGGER를 생성합니다.
CREATE OR REPLACE TRIGGER EVAL_CHANGE_TRIGGER AFTER INSERT OR UPDATE OR DELETE ON EVALUATIONS DECLARE log_action EVALUATIONS_LOG.action%TYPE; BEGIN IF INSERTING THEN log_action := 'Insert'; ELSIF UPDATING THEN log_action := 'Update'; ELSIF DELETING THEN log_action := 'Delete'; ELSE DBMS_OUTPUT.PUT_LINE('This code is not reachable.'); END IF; INSERT INTO EVALUATIONS_LOG (log_date, action) VALUES (SYSDATE, log_action); END;
참조: Oracle Database PL/SQL Language Reference - 조건부 술어에 대한 자세한 내용을 참조하십시오.
자습서: 삽입하기 전에 행의 기본 키를 생성하는 트리거 생성
이 자습서에서는 EVALUATIONS 테이블에 행이 삽입되기 전에 SQL Developer 트리거 생성 툴을 사용하여 EVALUATIONS_SEQUENCE를 사용하여 해당 행의 기본 키에 대한 고유 번호를 생성하는 방법을 보여 줍니다.
EVALUATIONS_SEQUENCE 시퀀스("자습서: 시퀀스 만들기"에서 생성됨)는 EVALUATIONS 테이블에 대한 기본 키를 생성합니다(생성됨). 그러나 이러한 기본 키가 테이블에 자동으로 삽입되지는 않습니다.
이 자습서에서는 SQL Developer 트리거 생성 툴을 사용하여 EVALUATIONS 테이블에 행이 삽입되기 전에 발생하며, EVALUATIONS_SEQUENCE를 사용하여 해당 행의 기본 키에 대한 고유 번호를 생성하는 NEW_EVALUATION_TRIGGER라는 트리거를 생성하는 방법을 보여줍니다. 트리거는 INSERT 문 트리거의 영향을 받는 각 행에 한 번씩 트리거가 발생합니다.
NEW_EVALUATION_TRIGGER는 행 레벨 트리거이자 BEFORE 트리거입니다.
NEW_EVALUATION 트리거를 생성하는 단계는 다음과 같습니다.
-
Connections(연결) 프레임에서 hr_conn을 확장합니다.
-
스키마 객체 유형 목록에서 트리거를 마우스 오른쪽 버튼으로 누릅니다.
-
선택 항목 목록에서 새 트리거를 선택합니다.
-
Create Trigger window에서 다음을 수행합니다.
-
[이름] 필드에서 기본값 TRIGGER1에
NEW_EVALUATION_TRIGGER를 입력합니다. -
기본 객체의 경우 메뉴에서 EVALUATIONS를 선택합니다.
-
사용 가능한 이벤트에서 선택한 이벤트로 INSERT를 이동합니다.
(INSERT를 선택하고 >를 선택합니다.)
-
명세서 레벨 옵션의 선택을 해제합니다.
-
확인을 선택합니다.
NEW_EVALUATION_TRIGGER 창이 열리고 트리거를 생성한 CREATE TRIGGER 명령문을 표시합니다.
CREATE OR REPLACE TRIGGER NEW_EVALUATION_TRIGGER BEFORE INSERT ON EVALUATIONS FOR EACH ROW BEGIN NULL; END;NEW_EVALUATION_TRIGGER 창의 제목이 기울임꼴로 표시되어 트리거가 데이터베이스에 아직 저장되지 않았음을 나타냅니다.
-
-
CREATE TRIGGER 명령문에서 NULL을 다음 텍스트로 바꿉니다.
:NEW.evaluation_id := evaluations_sequence.NEXTVAL -
[파일] 메뉴에서 저장을 선택합니다.
프로시저가 컴파일되고 저장됩니다. NEW_EVALUATION_TRIGGER 창의 제목이 더 이상 기울임꼴 글꼴로 표시되지 않음
INSTEAD OF 트리거 생성
뷰에서는 질의 출력이 테이블로 표시됩니다. 테이블을 변경하는 것처럼 뷰를 변경하려면 INSTEAD OF 트리거를 생성해야 합니다. 이 트리거는 뷰를 변경하는 대신 기본 테이블을 변경합니다.
예를 들어, EMPLOYEES 테이블의 LAST_NAME 및 FIRST_NAME 열에서 생성되는 NAME 열이 있는 EMP_LOCATIONS 뷰를 고려해 봅니다.
CREATE VIEW EMP_LOCATIONS AS
SELECT e.EMPLOYEE_ID,
e.LAST_NAME || ', ' || e.FIRST_NAME NAME,
d.DEPARTMENT_NAME DEPARTMENT,
l.CITY CITY,
c.COUNTRY_NAME COUNTRY
FROM EMPLOYEES e, DEPARTMENTS d, LOCATIONS l, COUNTRIES c
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND
d.LOCATION_ID = l.LOCATION_ID AND
l.COUNTRY_ID = c.COUNTRY_ID
ORDER BY LAST_NAME;
"CREATE VIEW 문을 사용하여 뷰 생성"에서 생성된 EMP_LOCATIONS.NAME 뷰를 갱신하려면 EMPLOYEES.LAST_NAME 및 EMPLOYEES.FIRST_NAME을 갱신해야 합니다. 이것이 예 6-1의 INSTEAD OF 트리거가 수행하는 작업입니다.
NEW와 OLD는 행 레벨 트리거가 발생할 때마다 PL/SQL 런타임 엔진이 생성하고 채우는 의사 코드입니다. OLD와 NEW는 각각 트리거가 처리하는 레코드의 원래 값과 새 값을 저장합니다. 두 레코드는 PL/SQL 레코드의 일부 속성만 있기 때문에 의사 레코드라고 합니다.
예 6-1 INSTEAD OF 트리거 생성
CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE ON emp_locations
BEGIN
UPDATE employees SET
first_name = substr( :NEW.name, instr( :new.name, ',' )+2),
last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1)
WHERE employee_id = :OLD.employee_id;
END;
참조:
-
Oracle Database PL/SQL Language Reference for more information about INSTEAD OF triggers
-
OLD 및 NEW에 대한 자세한 내용은Oracle Database PL/SQL Language Reference를 참조하십시오.
자습서: LOGON 및 LOGOFF 이벤트에 기록하는 트리거 생성
이 자습서에서는 CREATE TRIGGER 문을 사용하여 두 개의 트리거 HR_LOGON_TRIGGER와 HR_LOGOFF_TRIGGER를 생성하는 방법을 보여 줍니다. 사용자 HR로 로그온한 후 HR_LOGON_TRIGGER에서 HR_USERS_LOG 테이블에 행을 추가합니다. 사용자 HR로 로그오프하기 전에 HR_LOGOFF_TRIGGER에서 HR_USERS_LOG 테이블에 행을 추가합니다.
HR_LOGON_TRIGGER와 HR_LOGOFF_TRIGGER는 시스템 트리거입니다. HR_LOGON_TRIGGER는 AFTER 트리거이고 HR_LOGOFF_TRIGGER는 BEFORE 트리거입니다.
HR_USERS_LOG, HR_LOGON_TRIGGER 및 HR_LOGOFF_TRIGGER를 생성하는 단계는 다음과 같습니다.
-
HR_USERS_LOG 테이블을 생성합니다.
CREATE TABLE hr_users_log ( user_name VARCHAR2(30), activity VARCHAR2(20), event_date DATE ); -
HR_LOGON_TRIGGER를 생성합니다.
CREATE OR REPLACE TRIGGER hr_logon_trigger AFTER LOGON ON HR.SCHEMA BEGIN INSERT INTO hr_users_log (user_name, activity, event_date) VALUES (USER, 'LOGON', SYSDATE); END; -
HR_LOGOFF_TRIGGER를 생성합니다.
CREATE OR REPLACE TRIGGER hr_logoff_trigger BEFORE LOGOFF ON HR.SCHEMA BEGIN INSERT INTO hr_users_log (user_name, activity, event_date) VALUES (USER, 'LOGOFF', SYSDATE); END;
참조: Oracle Database PL/SQL Language Reference - 시스템 트리거에 대한 자세한 내용을 참조하십시오.