Oracle_학습 개발 서브루틴트리거
1.트리거 안내
트리거 는 PL/SQL,자바,C 를 사용 하여 개발 할 수 있 는 실 행 된 저장 과정 을 포함 하 며,특정 이벤트(예 를 들 어 표 수정,대상 구축,데이터베이스 로그 인)가 발생 하면 Oracle 은 트리거 에 해당 하 는 코드 를 자동 으로 실행 합 니 다.
트리거 는 트리거 이벤트,트리거 조건,트리거 작업 세 부분 으로 구성 된다.
1.트리거 이벤트
트리거 이 벤트 는 트리거 가 실 행 된 SQL,데이터베이스 이벤트 와 사용자 이 벤트 를 말 합 니 다.Oacle8i 이전에 트리거 이 벤트 는 DML 작업 만 할 수 있 습 니 다.Oacle8i 이후 DML 이 벤트 를 지원 할 뿐만 아니 라 다른 이벤트 도 추 가 했 습 니 다.구체 적 인 이 벤트 는 다음 과 같 습 니 다.
시작 및 닫 기 루틴
Oracle 오류 정보
사용자 로그 인 및 세 션 닫 기
특정 테이블 과 보기 의 DML 동작
DDL 구문
2.트리거 조건(선택 가능)
트리거 조건 은 when 자 구 를 사용 하여 boolean 표현 식 을 지정 하고 표현 식 이 true 로 돌아 갈 때 트리거 에 해당 하 는 코드 를 실행 하 며 표현 식 이 false 나 unknown 으로 돌아 가면 트리거 에 해당 하 는 코드 를 실행 하지 않 습 니 다.
3.트리거 조작
트리거 조작 이란 SQL 구문 과 다른 실행 코드 를 포함 하 는 PL/SQL 블록 으로 PL/SQL 개발 뿐만 아니 라 자바 또는 c 언어 개발 도 가능 하 며 트리거 조건 이 true 일 경우 트리거 조작 에 해당 하 는 코드 를 자동 으로 실행 합 니 다.그러나 트리거 실행 코드 를 작성 할 때 제한 을 주의해 야 합 니 다.
트리거 코드 크기 는 32k 를 초과 할 수 없습니다.만약 에 대량의 코드 를 사용 하여 트리거 를 만들어 야 한다 면 먼저 저장 과정 을 구축 한 다음 에 트리거 에서 call 문 구 를 사용 하여 저장 과정 을 호출 해 야 합 니 다.
트리거 코드 는 insert,update,delete 문장 만 포함 할 수 있 고 DDL 문장(create,drop,alert)과 사무 제어 문장(commt,rollback,savepoint)은 포함 할 수 없습니다.
2.DML 트리거 구축
DML 트리거 를 만 들 때 트리거 타 이 밍(before 와 after),트리거 이벤트(insert,select,update,delete),표 이름,트리거 유형,트리거 조건 및 트리거 작업 을 지정 해 야 합 니 다.
1.촉발 시기
트리거 타 이 밍 은 트리거 의 트리거 시간 을 말 합 니 다.before 키 워드 를 지정 할 때 DML 작업 을 수행 하기 전에 트리거 를 터치 하 는 것 을 의미 합 니 다.after 키 워드 를 지정 하면 DML 동작 을 실행 한 후 트리거 를 터치 한 다 는 뜻 입 니 다.
2.트리거 이벤트
트리거 조건 은 트리거 실행 을 일 으 키 는 DML 구문,즉 insert,update,delete 작업 을 말한다.하나의 트리거 이 벤트 를 사용 할 수도 있 고 여러 개의 트리거 이 벤트 를 조합 할 수도 있 습 니 다.
시계
DML 트리거 는 특정 테이블 을 대상 으로 실행 되 기 때문에 DML 작업 에 대응 하 는 테이블 이름 을 지정 해 야 합 니 다.
4.트리거 유형
트리거 형식 은 트리거 이벤트 가 발생 한 후 몇 번 의 트리거 동작 을 수행 해 야 하 는 지 지정 하 는 데 사 용 됩 니 다.지정 한 구문 트리거 유형(기본 값)이 있 으 면 트리거 코드 를 한 번 만 실행 하고 줄 트리거 를 지정 하면 모든 역할 줄 에서 트리거 를 한 번 씩 실행 합 니 다.
5.촉발 조건
트리거 조건 은 트리거 코드 를 실행 할 조건 을 지정 하 는 데 사 용 됩 니 다.조건 이 true 일 때 만 트리거 코드 를 실행 할 수 있 습 니 다.DML 트리거 를 작성 할 때 행 트리거 에서 만 트리거 조건 을 실행 할 수 있 습 니 다.
6.트리거 조작
트리거 동작 은 트리거 가 실행 할 코드 를 지정 하 는 데 사 용 됩 니 다.PL/SQL 저장 프로 세 스,자바 저장 프로 세 스 또는 외부 저장 프로 세 스 를 사용 하면 트리거 동작 에서 call 문 구 를 사용 하여 해당 프로 세 스 를 호출 합 니 다.PL/SQL 익명 블록 을 사용 하여 트리거 동작 을 작성 하면 다음 형식 으로 작 성 됩 니 다.
[declare]
변수,상수 등 을 정의 합 니 다.
begin
SQL 구문 이나 PL/SQL 블록 을 작성 합 니 다.
exception
예외 처리 문 구 를 작성 하 다.
end;
7.DML 트리거 트리거 순서
(1)DML 트리거 가 단일 데이터 에서 순 서 를 수행 합 니 다.
단일 줄 데이터 에 있어 서 문장 트리거 든 행 트리거 든 모두 한 번 실행 하고 실행 순 서 는?
before 문 트리거,before 행 트리거,DML 조작,after 행 트리거,after 문 트리거.
(2)DML 트리거 가 여러 줄 의 데이터 에서 순 서 를 수행 합 니 다.
다 중 줄 데이터 에 있어 서 문 트리거 는 한 번 만 실행 되 고 행 트리거 는 모든 역할 줄 에서 한 번 씩 실 행 됩 니 다.
트리거
구문 트리거 는 DML 문 구 를 실행 할 때 실 행 된 트리거 를 포함 합 니 다.문장 트리거 를 주의 할 때 열 데이터 의 변 화 를 기록 할 수 없습니다.구문 트리거 를 만 드 는 문법 은 다음 과 같 습 니 다.
오 라 클 코드
create or replace trigger trigger_name
timing event1[or event2 or event3]
on table_name
pl/sql block;
create or replace trigger trigger_name
timing event1[or event2 or event3]
on table_name
pl/sql block;
위 와 같이:triggername 트리거 이름 을 지정 하 는 데 사 용 됩 니 다.timing 은 트리거 타 이 밍(before 와 after)을 지정 하 는 데 사 용 됩 니 다.event 1 은 트리거 이벤트(insert,update,delete),table 을 지정 하 는 데 사 용 됩 니 다.name 은 DML 작업 에 대응 하 는 표 이름 을 지정 하 는 데 사 용 됩 니 다.
1.before 구문 트리거 구축
직원 들 이 휴일 에 직원 정 보 를 바 꾸 는 것 을 금지 하기 위해 before 문 트리거 를 만들어 데이터 의 안전 보 호 를 실현 할 수 있 습 니 다.예 를 들 어 다음 과 같 습 니 다.
오 라 클 코드
create or replace trigger trigger_before
before insert or update or delete on cip_tmps
begin
if to_char(sysdate,'DY','nls_date_language=AMERICAN')
IN ('STA','SUN','THU','WED') then
raise_application_error(-20001,' ');
end if;
end;
create or replace trigger trigger_before
before insert or update or delete on cip_tmps
begin
if to_char(sysdate,'DY','nls_date_language=AMERICAN')
IN ('STA','SUN','THU','WED') then
raise_application_error(-20001,' ');
end if;
end;
2.사용 조건 서술 어
트리거 에 여러 개의 트리거 시간(insert,update,delete)을 동시에 포함 할 때 트리거 코드 에서 구체 적 인 트리거 사건 을 구분 하기 위해 다음 과 같은 세 가지 조건 을 사용 할 수 있 습 니 다.
INSERTING:트리거 조건 이 insert 작업 일 때 이 조건 술어 의 반환 값 은 true 이 고 그렇지 않 으 면 반환 값 은 false 입 니 다.
UPDATING:트리거 조건 이 update 작업 일 때 이 조건 술어 의 반환 값 은 true 이 고 그렇지 않 으 면 반환 값 은 false 입 니 다.
DELETING:트리거 조건 이 delete 작업 일 때 이 조건 술어 의 반환 값 은 true 이 고 그렇지 않 으 면 반환 값 은 false 입 니 다.
다음은 트리거 에서 이 세 가지 조건 용 어 를 사용 하 는 방법 을 예시 합 니 다.예 는 다음 과 같 습 니 다.
오 라 클 코드
create or replace trigger trigger_before
before insert or update or delete on cip_tmps
begin
if to_char(sysdate,'DY','nls_date_language=AMERICAN')
IN ('STA','SUN','THU','WED') then
case
when inserting then
raise_application_error(-20001,' ');
when updating then
raise_application_error(-20002,' ');
when deleting then
raise_application_error(-20003,' ');
end case;
end if;
end;
create or replace trigger trigger_before
before insert or update or delete on cip_tmps
begin
if to_char(sysdate,'DY','nls_date_language=AMERICAN')
IN ('STA','SUN','THU','WED') then
case
when inserting then
raise_application_error(-20001,' ');
when updating then
raise_application_error(-20002,' ');
when deleting then
raise_application_error(-20003,' ');
end case;
end if;
end;
3.after 구문 트리거 구축
ciptemp 표 에 데 이 터 를 삽입 할 때 동시에 ciptemps 표 에 데 이 터 를 삽입 합 니 다.필수 조건 은"cip"입 니 다.temp 표 에는 마지막 으로 삽 입 된 기록 을 표시 하 는 필드 가 있어 야 합 니 다.
오 라 클 코드
4.567913.4.행 트리거 구축
행 트리거 란 DML 동작 을 수행 할 때 한 줄 에 한 번 씩 트리거 를 하 는 것 을 말한다.줄 트리거 만 들 기 문법 은 다음 과 같 습 니 다.
오 라 클 코드
create or replace trigger trigger_after
after insert on cip_temp
begin
insert into cip_temps (select * from(select * from cip_temp order by id) where rownum=1);
end;
create or replace trigger trigger_after
after insert on cip_temp
begin
insert into cip_temps (select * from(select * from cip_temp order by id) where rownum=1);
end;
위 와 같이:triggername 트리거 이름 을 지정 하 는 데 사 용 됩 니 다.timing 은 트리거 타 이 밍(before 와 after)을 지정 하 는 데 사 용 됩 니 다.event 1 은 트리거 이벤트(insert,update,delete),table 을 지정 하 는 데 사 용 됩 니 다.name 은 DML 작업 에 대응 하 는 표 이름 을 지정 하 는 데 사 용 됩 니 다.REFERENCING 자 구 는 새,옛,데이터 방식 을 인용 하 는 데 사 용 됩 니 다.기본적으로 old 수식 자 를 사용 하여 오래된 데 이 터 를 인용 하고 new 수식 자 를 사용 하 는 것 은 새 데 이 터 를 인용 하 는 것 입 니 다.for each row 는 줄 트리거 를 만 드 는 것 을 표시 합 니 다.
1.before 줄 트리거 만 들 기
직원 의 임금 이 가격 을 올 릴 수 없 도록 확보 하 는 예 는 다음 과 같다.
오 라 클 코드
create or replace trigger trigger_name
timing event1[or event2 or event3]
on table_name
[REFERENCING NEW AS NEW | OLD AS OLD]
for each row
pl/sql block;
create or replace trigger trigger_name
timing event1[or event2 or event3]
on table_name
[REFERENCING NEW AS NEW | OLD AS OLD]
for each row
pl/sql block;
2.after 행 트리거 구축
한 표 의 데 이 터 를 업데이트,삭제,추가 하면 다른 표 도 해당 하 는 업데이트,삭제,추가 합 니 다.
오 라 클 코드
create or replace trigger trigger_before_row
before update on cip_tmp
for each row
begin
if(:new.id <>:old.id) then
raise_application_error(-20001,' ');
end if;
end;
create or replace trigger trigger_before_row
before update on cip_tmp
for each row
begin
if(:new.id <>:old.id) then
raise_application_error(-20001,' ');
end if;
end;
3.제한 행 트리거
줄 트리거 를 사용 할 때 기본적으로 줄 마다 트리거 를 실행 하 는 데 작용 합 니 다.특정한 조건 에서 줄 트리거 코드 를 실행 하기 위해 서 는 when 자 구 를 사용 하여 트리거 조건 을 제한 해 야 합 니 다.
예 는 다음 과 같다.
오 라 클 코드
create or replace trigger trigger_after_row
after insert or update or delete on cip_test
for each row
declare
v_update int;
v_delete int;
begin
case
when inserting then
insert into cip_temps values(:new.name,:new.age,:new.address,:new.id);
when updating then
select count(*) into v_update from cip_temps where id=:old.id;
if(v_update=0) then
insert into cip_temps values(:new.name,:new.age,:new.address,:new.id);
else
update cip_temps set name=:new.name,age=:new.age,address=:new.address
where id=:old.id;
end if;
when deleting then
select count(*) into v_delete from cip_temps where id=:old.id;
if(v_delete<>0)then
delete from cip_temps where id=:old.id;
end if;
end case;
end;
create or replace trigger trigger_after_row
after insert or update or delete on cip_test
for each row
declare
v_update int;
v_delete int;
begin
case
when inserting then
insert into cip_temps values(:new.name,:new.age,:new.address,:new.id);
when updating then
select count(*) into v_update from cip_temps where id=:old.id;
if(v_update=0) then
insert into cip_temps values(:new.name,:new.age,:new.address,:new.id);
else
update cip_temps set name=:new.name,age=:new.age,address=:new.address
where id=:old.id;
end if;
when deleting then
select count(*) into v_delete from cip_temps where id=:old.id;
if(v_delete<>0)then
delete from cip_temps where id=:old.id;
end if;
end case;
end;
4.DML 트리거 사용 주의사항
DML 트리거 를 작성 할 때 트리거 코드 는 트리거 에 대응 하 는 표 에서 데 이 터 를 읽 을 수 없습니다.
5.참조 완전 성 실현
참조 완전 성 이란 두 표 가 주종 관계(주 외 건 관계)를 가지 고 있 으 며,주 표 데 이 터 를 삭제 할 때 표 에서 의 데이터 도 삭제 되 어야 하 며,외부 키 제약 을 정의 할 때 on delete 캐 스 케 이 드 를 지정 할 수 있 습 니 다.
5.행 트리거 와 구문 트리거 의 차이
1.행 트리거 에는 for each row 자구 가 있 습 니 다.문장 트리거 에 for each row 자구 가 없습니다.
2.행 트리거,when 을 트리거 제한 으로 사용 할 수 있 으 며,new/old 를 사용 할 수 있 습 니 다.구문 트리거 는 when 을 트리거 제한 으로 할 수 없습니다.
3.행 트리거:DML 구문 에 영향 을 미 치 는 표 의 모든 줄 에 대응 하여 트리거 는 한 번 씩 실행 해 야 합 니 다.
4.구문 트리거:DML 구문 에 영향 을 주 는 표 의 모든 줄 에 대응 하고 트리거 는 한 번 만 실 행 됩 니 다.
시 계 를 줄 급 으로 터치 하면 이 시 계 는 잠시 조작 할 수 없습니다(즉,이 시 계 는 이미 변이 표 가 되 었 습 니 다)표 급 트리거 는 이와 다 릅 니 다.
글 정보 출처:
http://shawnfree.iteye.com/blog/359240
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
activemq 5.5 의 입문 은 설치, 시작, 데이터베이스 지속 화 를 포함한다Apache ActiveMQ 5.5.0 은 주로 유지보수 버 전 으로 130 개가 넘 는 문 제 를 복 구 했 으 며 대부분 bug 와 개선 이 었 다. Improved performance for offline d...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.