데이터베이스 학습 노트 및 작은 연습 (10) 트리거

2322 단어 데이터베이스
트리거:trigger는 사용자가 관계표에 정의한 이벤트로 구동되는 특수한 과정입니다. 트리거는 정의된 후에 데이터베이스 서버에 저장됩니다. 사용자가 테이블에 대한 조작을 하면 서버는 자동으로 이 트리거를 활성화합니다.
트리거는 이벤트-조건-동작 규칙이라고도 부른다
즉, 이벤트 발생 -> 확인 기준 -> 작업 수행 (조건이 충족된 경우)
사실은 사전에 어떤 시계를 위해 코드를 연결한 것이다. 시계에 대해 어떤 조작(삭제 수정)을 할 때 시스템은 자동으로 코드를 터치하여 실행한다.
# 트리거는 기본 테이블에만 정의할 수 있고 (보기는 지원되지 않음) 테이블을 만든 사용자만 테이블에 트리거를 정의할 수 있습니다.
# 트리거 시간: after는 트리거 이벤트의 작업이 실행된 후에 트리거를 활성화하는 것을 가리키며, before는 이전이다
# 이벤트 트리거: insert delete update일 수도 있고, 몇 개의 이벤트 조합일 수도 있습니다.
# 트리거 객체: 행 트리거와 문장 트리거로 구분하여 트리거 동작의 간격을 나타냅니다.
트리거의 실행은 트리거 이벤트에 의해 활성화되고 데이터베이스 서버에서 자동으로 실행됩니다. 한 데이터 테이블에 여러 개의 트리거가 정의될 수 있습니다(3가지 조작, 두 가지 실행 시간이 있기 때문에 최대 6가지)
1 이 테이블의 before 트리거를 실행합니다
2 트리거 활성화 sql 문장
3 이 표의 after 문장을 실행합니다
(이 세 동작은 하나의 순서의 동작으로 어떤 동작이 실패하더라도 뒤의 동작은 다시 실행하지 않는다)
트리거 생성하기
논리적 완비에서 볼 때 우리는 트리거의 이름을 제시해야 한다. 관련된 것은 어떤 표인지, 어떤 활동에 응답해야 하는지, 언제 응답해야 하는지.
create trigger 트리거 이름 트리거 이벤트 형식 on 테이블 이름
 for each row/  statement 
[when 트리거 조건]
begin
트리거 내용
end
(한 문장만 있을 때begin.end를 생략할 수 있습니다)
트리거 레코드:
시스템은 현재 조작할 기록의 현재 상태를old에 저장하고, 조작 후의 가능한 상태는new에 저장합니다
(new는 사건 이후의 새로운 값이고,old는 사건 이전의 낡은 값이다)
(삭제할 때는 new가 없고, 삽입할 때는old가 없다) (삽입하기 전, 삭제한 후에는 아무것도 없기 때문이다)
(referencing으로 new old 개명 가능)
트리거 삭제:
drop trigger  on ;

(트리거는 업데이트하거나 덮어쓸 수 없습니다. 트리거를 수정하려면 먼저 삭제하고 다시 만들어야 합니다.)
밤을 들다.
SC 테이블의grade 속성을 수정할 때 점수가 10% 증가하면 이 동작을 SC_에 기록합니다U 테이블
create trigger SC_T
after update of Grade on SC
for each row
when(new.grade >= 1.1* old.grade)
insert into SC_U(Sno,Cno,OldGrade,NewGrade)
values(old.Sno,old.Cno,old.Grade,new.Grade)

이것은 이해하기 쉽다. 조회 조건과 어떤 줄에 대한 업데이트를 이용했다
밤을 하나 더 들다.
교사표 Teacher를 위해 완전성 규칙을 정의합니다. "교수의 임금은 4000위안보다 낮으면 안 되고, 4000위안보다 낮으면 자동으로 4000위안으로 바꿉니다."
create trigger Insert_Or_Update_Sal
before insert or update on Teacher
for each row
begin
if(new.Job=' ')and(new.Sal<4000)
then new.Sal := 400;
end if;
end;

이 예도 이해하기 쉽지만 다양한 조작 정의 트리거, begin...end 문장 그룹, if 문장, 값 부여 문장
그러나 mydql 환경에서 값을 부여하는 문장: = 테스트 시 set new로 변경되지 않았습니다.Job='교수'통과
주의:delimiter는 begin end와 자주 어울립니다. 문장 끝 문자를 바꿔서 begin end 안의 여러 문장이 전체 명령을 끝내지 않고 분호로 끝날 수 있도록 해야 하기 때문입니다.

좋은 웹페이지 즐겨찾기