Pl/SQL 에서 트리거 란 무엇입니까?
트리거는 Insert,update,delete 와 같은 DML 문이 테이블에서 실행되거나 일부 이벤트가 발생할 때 Oracle engine 에서 자동으로 실행되는 저장된 프로그램입니다. 트리거의 경우 제외할 코드는 요구 사항에 따라 정의할 수 있습니다. 트리거가 발사 될 필요가있는 이벤트와 실행의 타이밍을 선택할 수 있습니다. 트리거의 목적은 데이터베이스에 대한 정보의 무결성을 유지하는 것입니다.
이 튜토리얼에서 당신 배우-
- 혜택의 트리거
- 유형의 트리거에는 Oracle
- 을 만드는 방법을 트리거
- :새로운 및:오래 된 절
- 대신 트리거
- 화합물을 트리거
혜택의 트리거
다음과 같은 혜택의 트리거합니다.
- 생성하는 파생된 열 값을 자동으로
- 을 시행을 참조 무결성
- 이벤트 로깅과에 정보를 저장하는 테이블의 접속
- 감사
- Synchronous 복제의 테이블
- 부과 보안 권한 부여
- 을 방지하는 잘못된 거래
유형의 트리거에는 Oracle
트리거에 근거하여 분류될 수 있습니다 다음 매개 변수입니다.
- 에 근거를 두는 분류합 타이밍
- 하기 전에 트리거:그것을 발생하기 전에 지정된 이벤트가 발생했습니다.
- 트리거 후:지정된 이벤트가 발생한 후에 발생합니다.트리거 대신
- :특별한 유형입니다. 추가 주제에 대해 더 배우게됩니다. (단 DML)
- 분류 수준에 따라
- 문 레벨 트리거:그것은 화재로 한 시간에 대한 이벤트를 지정하는 문입니다.
- 행 레벨 트리거:지정된 이벤트에서 영향을받은 각 레코드에 대해 발생합니다. (단 DML)
- 분류에 따라 이벤트
- DML 트리거:그것은 화재 때 DML 이벤트가 지정(삽입 업데이트//삭제)
- DDL 트리거: 그것은 화재 때 DDL 이벤트가 지정(CREATE/ALTER)
- 데이터베이스 트리거:그것은 화재로 할 때 데이터베이스에 이벤트가 지정한(로그온/로그오프/STARTUP/SHUTDOWN)
이 각 트리거의 조합을 위 매개 변수입니다.
트리거를 만드는 방법
아래는 트리거를 만드는 구문입니다.
CREATE TRIGGER <trigger_name> ON<name of underlying object> DECLARE<Declaration part>BEGIN<Execution part> EXCEPTION<Exception handling part> END;
구문 설명:
- 위에 구문을 보여줍니다른 선택 사항이 있는 문의에 존재하거 창조이다.
- BEFORE/AFTER 는 이벤트 타이밍을 지정합니다.
- 삽입/업데이트/로그온/만들기/등 트리거를 발사해야하는 이벤트를 지정합니다.
- on 절은 위에서 언급 한 이벤트가 유효한 객체를 지정합니다. 예를 들어 dml 트리거의 경우 dml 이벤트가 발생할 수 있는 테이블 이름이 됩니다.
- 명령”각 행에 대해”행 레벨 트리거를 지정합니다.
- WHEN 절은 트리거가 발사해야하는 추가 조건을 지정합니다.
- 선언 부분,실행 부분,예외 처리 부분은 다른 PL/SQL 블록과 동일합니다. 선언 부분과 예외 처리 부분은 선택 사항입니다.
:NEW 및:OLD 절
행 레벨 트리거에서 각 관련 행에 대해 트리거가 발생합니다. 그리고 때로는 DML 문 전후의 값을 알아야합니다.
Oracle 은 이러한 값을 보유하기 위해 레코드 수준 트리거에 두 개의 절을 제공했습니다. 이 절을 사용하여 트리거 바디 내부의 이전 값과 새 값을 참조 할 수 있습니다.
- :새로운것을 보유하고 새로운 값을 열에 대한 기본 테이블의/보기 동안 트리거 실행
- :전–그것을 보유하고 오래된 가치는 열의 기본 테이블의/보기 동안 트리거 실행
이 절은 사용해야에 기초 DML 이벤트입니다. 아래 표는 어떤 절이 어떤 DML 문에 유효한지 지정합니다(삽입/업데이트/삭제).
삽입 | 업데이트 | 삭제 | ||||
:새로운 | 유효 | 유효 | 잘못되었습니다. 삭제 대소 문자에는 새로운 값이 없습니다. 나는 이것을 할 수 없다. :이전 | 유효하지 않습니다. 없는 오래된 가치에 삽입하는 경우 | 유효 | 유효 |
대신 트리거
“대신 트리거”특별한 형식의 트리거입니다. DML 트리거에서만 사용됩니다. 복잡한 뷰에서 DML 이벤트가 발생할 때 사용됩니다.
3 개의 기본 테이블에서 뷰가 만들어지는 예를 생각해보십시오. 이 뷰를 통해 모든 DML 이벤트가 발행되면 데이터가 3 개의 다른 테이블에서 가져 오기 때문에 유효하지 않게됩니다. 그래서 이것에 대신 트리거가 사용됩니다. 대신 트리거는 주어진 이벤트에 대한 뷰를 수정하는 대신 기본 테이블을 직접 수정하는 데 사용됩니다.
예제 1:이 예제에서는 두 개의 기본 테이블에서 복잡한 뷰를 만들려고합니다.
- Table_1 은 emp 테이블이고
- Table_2 는 부서 테이블입니다.
그런 다음이 복잡한보기에서 위치 세부 정보 문을 업데이트하는 대신 트리거가 어떻게 사용되는지 살펴 보겠습니다. 우리는 또한:NEW and:OLD 가 트리거에서 어떻게 유용한지를 보게 될 것입니다.
- 1 단계: 성 테이블’emp’과’dept’으로 적절한 열
- 2 단계:채워 테이블와 샘플 값
- 3 단계:을 만들기 위해 만들어진 테이블
- 4 단계:의 업데이트를 보기 전에 대신 트리거
- 5 단계:창조의신-의 트리거
- 6 단계: 의 업데이트를 보기 후에는 대신에 의거
1 단계) 성 테이블’emp’과’dept’으로 적절한 열
CREATE TABLE emp(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager VARCHAR2(50),dept_no NUMBER);/CREATE TABLE dept( Dept_no NUMBER, Dept_name VARCHAR2(50),LOCATION VARCHAR2(50));/
코드 설명
- 코드 라인 1-7: 테이블’emp’생성.
- 코드 줄 8-12:테이블’부서’작성.
출력
테이블 만든
단계 2)이후 지금 우리가 만든 테이블,우리가 채우는 이와 테이블 샘플 값을 만들기 위한 위의 테이블이 있습니다.
BEGININSERT INTO DEPT VALUES(10,‘HR’,‘USA’);INSERT INTO DEPT VALUES(20,'SALES','UK’);INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN'); COMMIT;END;/BEGININSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30);INSERT INTO EMP VALUES(1001,‘YYY5,18000,‘AAA’,20) ;INSERT INTO EMP VALUES(1002,‘ZZZ5,20000,‘AAA',10); COMMIT;END;/
코드 설명
- 코드 라인 13-19:데이터를 삽입하는’dept’테이블.
- 코드 라인 20-26:데이터를’emp’테이블에 삽입합니다.
출력
PL/SQL 절차를 완료된
3 단계)을 만들기 위해 만들어진 테이블.
CREATE VIEW guru99_emp_view(Employee_name:dept_name,location) ASSELECT emp.emp_name,dept.dept_name,dept.locationFROM emp,deptWHERE emp.dept_no=dept.dept_no;/
SELECT * FROM guru99_emp_view;
코드 설명
- 코드 라인 27-32:창조의’guru99_emp_view’view.
- 코드 라인 33:Guru99_emp_view 쿼리.
Output
View created
EMPLOYEE_NAME | DEPT_NAME | LOCATION |
ZZZ | HR | USA |
YYY | SALES | UK |
XXX | FINANCIAL | JAPAN |
Step 4) Update of view before instead-of trigger.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/
Code Explanation
- Code line 34-38: Update the location of “XXX” to ‘FRANCE’. Dml 문이 복잡한 뷰에서 허용되지 않기 때문에 예외가 발생했습니다.
출력
ORA-01779:를 수정할 수 없는 열도를 비 키-보존 table
ORA-06512:에서 선 2
5 단계)오류가 발생하지 않도록 하려면 발생하는 동안 업데이트 보기 이전 단계에서,이 단계에서 우리가 사용하”대신 트리거입니다.”
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
코드 설명
- 코드 라인 39: 행 수준의’GURU99_EMP_VIEW’보기에서’업데이트’이벤트에 대한 트리거 대신 생성. 여기에는 기본 테이블’부서’의 위치를 업데이트하는 업데이트 문이 포함되어 있습니다.
- 코드 줄 44:Update 문은’:NEW’및’:OLD’를 사용하여 업데이트 전후의 열 값을 찾습니다.
출력
트리거 생성
6 단계)대신 트리거 후보기 업데이트. 이제”트리거 대신”이 복잡한보기의 업데이트 작업을 처리하므로 오류가 발생하지 않습니다. 그리고 코드가 실행되었을 때 직원 XXX 의 위치는”일본”에서”프랑스”로 업데이트됩니다.”
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT;END;/
SELECT * FROM guru99_emp_view;
코드 설명:
- 코드 라인 49-53:업데이트의 위치”XXX”하는’프랑스’. ‘대신’트리거가보기에서 실제 업데이트 문을 중지하고 기본 테이블 업데이트를 수행했기 때문에 성공적입니다.
- 코드 라인 55:업데이트 된 레코드 확인.
출력:
PL/SQL 절차를 성공적으로 완료되
EMPLOYEE_NAME | DEPT_NAME | 위 |
ZZZ | HR | 미국 |
YYY | 판매 | 영국 |
XXX | 금융 | 프랑스 |
화합물을 트리거
화합물을 트리거 방아쇠를 지정할 수 있는 행동에 대한 각각의 네 개의 타이밍점에서 하나의 트리거체. 그것이 지원하는 4 개의 다른 타이밍 포인트는 아래와 같습니다.
- 기 전에 문을위
- 기 전에 행위
- 후 행위
- 후 문을위
기능을 제공합을 결합하는 작업에 대한 서로 다른 타이밍으로 동일한다.
CREATE TRIGGER <trigger_name> FORON <name of underlying object><Declarative part> BEFORE STATEMENT ISBEGIN<Execution part>;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN<Execution part>;END EACH ROW;AFTER EACH ROW ISBEGIN<Execution part>;END AFTER EACH ROW;AFTER STATEMENT ISBEGIN<Execution part>;END AFTER STATEMENT;END;
구문 설명:
- 위의 구문의 작성을 보여 줍니다’복’니다.
- 선언적 섹션은 트리거 본문의 모든 실행 블록에 공통적입니다.
- 이 4 개의 타이밍 블록은 임의의 순서로있을 수 있습니다. 이 4 가지 타이밍 블록을 모두 갖추는 것은 필수는 아닙니다. 필요한 타이밍에 대해서만 복합 트리거를 만들 수 있습니다.
예제 1:이 예에서는 급여 열을 기본값 5000 으로 자동 채우는 트리거를 만들려고합니다.
CREATE TRIGGER emp_trig FOR INSERT ON empCOMPOUND TRIGGER BEFORE EACH ROW IS BEGIN:new.salary:=5000;END BEFORE EACH ROW;END emp_trig;/
BEGININSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30); COMMIT;END;/
SELECT * FROM emp WHERE emp_no=1004;
코드 설명:
- 코드 라인 2-10:창조의 화합물을 트리거입니다. 급여를 기본값 5000 으로 채우기 위해 행 수준 이전의 타이밍을 위해 만들어집니다. 이렇게하면 레코드를 테이블에 삽입하기 전에 급여가 기본값’5000’으로 변경됩니다.
- 코드 줄 11-14:레코드를’emp’테이블에 삽입하십시오.
- 코드 라인 16:삽입 된 레코드 확인.
출력:
트리거 생성
PL/SQL 프로 시저가 성공적으로 완료되었습니다.
EMP_NAME | EMP_NO | 연봉 | 관리자 | DEPT_NO |
CCC | 1004 | 5000 | AAA | 30 |
활성화 및 비활성화가 트리거
트리거 활성화 또는 비활성화할 수 있습니다. 트리거를 활성화 또는 비활성화하려면 트리거에 대해 DDL(ALTER)문을 사용 중지하거나 사용하도록 설정해야합니다.
아래는 트리거를 활성화/비활성화하는 구문입니다.
ALTER TRIGGER <trigger_name> ;ALTER TABLE <table_name> ALL TRIGGERS;
구문 설명:
- 첫 번째 구문은 단일 트리거를 활성화/비활성화하는 방법을 보여줍니다.
- 두 번째 문은 특정 테이블의 모든 트리거를 활성화/비활성화하는 방법을 보여줍니다.
요약
이 장에서는 PL/SQL 트리거와 그 이점에 대해 배웠습니다. 우리는 또한 다른 분류를 배우고 트리거 및 복합 트리거 대신 논의했습니다.