본문 바로가기

분류 전체보기

(657)
089 - [Oracle PL/SQL] Trigger - Mutating error 트리거를 사용하다 Mutating 오류가 발생하는 이유와 해결하는 방법에 대해서 알아보자.   오류가 발생하는 이유는 실행한 쿼리의 일부 필드가 트리거에서 실행하는 쿼리와 충돌이 발생할 경우이다.다시 말하면 테이블이 수정되고 있는 상황에서 트리거가 같은 테이블을 접근하려 할때 발생한다. 예를 들어보면 신규 고객정보를 입력시, 고객 번호를 새로 만들어야 하는데, 시퀀스.nextval 을 사용하는 경우가 아니고 max(고객번호) + 1 같이, 기존의 고객번호의 최대값을 이용할 경우,아래와 같이 트리거를 작성할 수 있다. -- 준비 작업drop table customers/create table customers( cust_id number, cust_name varchar2(20));-- customers..
088 - [Oracle PL/SQL] Trigger - Follows Statement 동일한 조건으로 2개의 트리거가 있을경우, 어떤 트리거가 먼저 실행되는지 확인해보자.  준비 - 테스트 테이블, 트리거용 테이블, 시퀀스 생성drop table emp;/create table emp(id number,name varchar2(20));/drop table which_fired_first;/create table which_fired_first(seq number, trigger_name varchar2(20) );/drop sequence s1;/create sequence s1;   트리거 생성 - 우선순위 없이 생성create or replace trigger t1beforeinserton empbegininsert into which_fired_first values ( s1.ne..
087 - [Oracle PL/SQL] Trigger - Instead of triggers (on Views) 뷰에 삽입한 데이터를 다르게 처리하는 방법에 대해서 알아보겠습니다.   테스트 준비-- 테스트 준비(뷰 생성).DROP VIEW emp_all_v;/create or replace view emp_all_vas select * from employees;/select * from emp_all_v;   데이터 추가-- 테스트 데이터 입력.-- 뷰에 데이터를 삽입하면 원본 테이블에도 추가된다. 단, 단일테이블인 경우 등, 몇가지 조건하에서만 가능.INSERT INTO emp_all_v(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID)VALUES(10..
086 - [Oracle PL/SQL] Trigger - Default value 값을 입력하지 않아도 자동으로 값이 입력되는 샘플입니다.   테스트 준비drop table customers;/create table customers( cust_id number, name varchar2(100), status char(1));   트리거 컴파일create or replace trigger customers_defaulf_statusbeforeinserton customersFOR EACH ROWbegin :new.status:='A';end;   테스트 - 입력하지 않은 status 값이 자동으로 입력됨INSERT INTO customers(cust_id,name)VALUES(1,'OMAR');SELECT * FROM customers;------------------------..
085 - [Oracle PL/SQL] Trigger - Firing sequence 오라클에서 트리거가 실행되는 순서에 대해서 알아보자  오라클에서는 4 종류의 트리거가 순서대로 발생 - 5개의 row 가 업데이트되는 쿼리인 경우.   테스트 환경 준비drop table test_emp;/create table test_emp( emp_id number, first_name varchar2(30) );/drop table test_emp_sequence;create table test_emp_sequence( seq number, trigger_type varchar2(30) ); drop sequence s;create sequence s;   4종류의 트리거 생성--1 before statmentcreate or replace trigger before_insert_statbef..
084 - [Oracle PL/SQL] Trigger - Create Audit table(다중 조건) 특정 테이블이 변경되었을 경우, 어떤 변화들이 발생했는지 자동으로 저장하는 audit 관련 트리거를 만들어 보자.   준비사항-- 준비작업.drop table emp_copy;/create table emp_copyas select * from employees;/select * from emp_copy;/drop table EMP_SAL_AUDIT;/-- 테스트용 테이블 생성.CREATE TABLE EMP_SAL_AUDIT( EMP_ID NUMBER, OPERATION VARCHAR2(15), OLD_SAL NUMBER, NEW_SAL NUMBER, OP_DATE DATE, BY_USER VARCHAR2(10));   트리거 생성-- now we need to create trigger for..
083 - [Oracle PL/SQL] DML Triggers - row-level sample new, old 정의할것.   오류 발생 코드가 있어서 1회만 실행되는 샘플 코드DROP TABLE EMP_COPY;/CREATE TABLE EMP_COPYAS SELECT * FROM employees;/SELECT EMPLOYEE_ID, FIRST_NAME,LAST_NAME, SALARY FROM EMP_COPY;# 옵션은 row level trigger 이지만, 오류를 발생시키므로 1회만 동작된다.create or replace trigger check_salbeforeinsert or update of salaryonEMP_COPYfor each row -- row trigger 옵션begin if :new.salary   (오류 발생 코드가 없어서) 여러번 트리거가 발생하는 샘플 코드creat..
082 - [Oracle PL/SQL] DML Triggers - stament-level sample 간단한 샘플 코드 delete from departments; ----------------------------- Error report - ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated - child record found -- let us do statment level trigger create or replace trigger dept_check_time before insert or update or delete -- time, event on DEPARTMENTS -- table begin if to_number (to_char(sysdate,'hh24') ) not between 8 and 16 then raise_applicatio..