Oracle PL/SQL 트리거 자습서:대신 Compound[Example]

Pl/SQL 에서 트리거 란 무엇입니까?

트리거는 Insert,update,delete 와 같은 DML 문이 테이블에서 실행되거나 일부 이벤트가 발생할 때 Oracle engine 에서 자동으로 실행되는 저장된 프로그램입니다. 트리거의 경우 제외할 코드는 요구 사항에 따라 정의할 수 있습니다. 트리거가 발사 될 필요가있는 이벤트와 실행의 타이밍을 선택할 수 있습니다. 트리거의 목적은 데이터베이스에 대한 정보의 무결성을 유지하는 것입니다.

이 튜토리얼에서 당신 배우-

  • 혜택의 트리거
  • 유형의 트리거에는 Oracle
  • 을 만드는 방법을 트리거
  • :새로운 및:오래 된 절
  • 대신 트리거
  • 화합물을 트리거

혜택의 트리거

다음과 같은 혜택의 트리거합니다.

  • 생성하는 파생된 열 값을 자동으로
  • 을 시행을 참조 무결성
  • 이벤트 로깅과에 정보를 저장하는 테이블의 접속
  • 감사
  • Synchronous 복제의 테이블
  • 부과 보안 권한 부여
  • 을 방지하는 잘못된 거래

유형의 트리거에는 Oracle

트리거에 근거하여 분류될 수 있습니다 다음 매개 변수입니다.

  • 에 근거를 두는 분류합 타이밍
    • 하기 전에 트리거:그것을 발생하기 전에 지정된 이벤트가 발생했습니다.
    • 트리거 후:지정된 이벤트가 발생한 후에 발생합니다.트리거 대신
    • :특별한 유형입니다. 추가 주제에 대해 더 배우게됩니다. (단 DML)
  • 분류 수준에 따라
    • 문 레벨 트리거:그것은 화재로 한 시간에 대한 이벤트를 지정하는 문입니다.
    • 행 레벨 트리거:지정된 이벤트에서 영향을받은 각 레코드에 대해 발생합니다. (단 DML)
  • 분류에 따라 이벤트
    • DML 트리거:그것은 화재 때 DML 이벤트가 지정(삽입 업데이트//삭제)
    • DDL 트리거: 그것은 화재 때 DDL 이벤트가 지정(CREATE/ALTER)
    • 데이터베이스 트리거:그것은 화재로 할 때 데이터베이스에 이벤트가 지정한(로그온/로그오프/STARTUP/SHUTDOWN)

이 각 트리거의 조합을 위 매개 변수입니다.

트리거를 만드는 방법

아래는 트리거를 만드는 구문입니다.

트리거 PL/SQL

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’으로 적절한 열

트리거 PL/SQL

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)이후 지금 우리가 만든 테이블,우리가 채우는 이와 테이블 샘플 값을 만들기 위한 위의 테이블이 있습니다.

트리거 PL/SQL

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 단계)을 만들기 위해 만들어진 테이블.

트리거 PL/SQL

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.

Triggers in PL/SQL

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 단계)오류가 발생하지 않도록 하려면 발생하는 동안 업데이트 보기 이전 단계에서,이 단계에서 우리가 사용하”대신 트리거입니다.”

트리거 PL/SQL

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 의 위치는”일본”에서”프랑스”로 업데이트됩니다.”

트리거 PL/SQL

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 개의 다른 타이밍 포인트는 아래와 같습니다.

  • 기 전에 문을위
  • 기 전에 행위
  • 후 행위
  • 후 문을위

기능을 제공합을 결합하는 작업에 대한 서로 다른 타이밍으로 동일한다.

트리거 PL/SQL

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 으로 자동 채우는 트리거를 만들려고합니다.

트리거 PL/SQL

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 트리거와 그 이점에 대해 배웠습니다. 우리는 또한 다른 분류를 배우고 트리거 및 복합 트리거 대신 논의했습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다