> php教程 > PHP开发 > SQL 트리거 동작에 대한 자세한 설명

SQL 트리거 동작에 대한 자세한 설명

高洛峰
풀어 주다: 2016-12-14 16:28:08
원래의
1543명이 탐색했습니다.

트리거가 테이블에 삽입, 업데이트 또는 삭제될 때 자동으로 실행되는 특수 저장 프로시저입니다. 트리거는 일반적으로 더 복잡한 검사 제약 조건이 있는 제약 조건에 사용됩니다. 트리거와 일반 저장 프로시저의 차이점은 트리거가 특정 테이블에서 작동한다는 것입니다. 업데이트, 삽입, 삭제 등의 작업 중에 시스템은 테이블에서 해당 트리거를 자동으로 호출하고 실행합니다. SQL Server 2005의 트리거는 DML 트리거와 DDL 트리거의 두 가지 범주로 나눌 수 있습니다. DDL 트리거는 다양한 데이터 정의 언어 문에 영향을 미치며 트리거되는 문에는 create, alter 및 drop 문이 포함됩니다.

삽입, 업데이트, 삭제 이벤트에 각각 적용되는 세 가지 일반적인 트리거가 있습니다.

트리거를 사용해야 하는 이유는 무엇인가요? 예를 들어 다음 두 테이블은 다음과 같습니다.

학생 테이블 만들기(                                                                    StudentID int  

테이블 BorrowRecord 만들기(                                      >                            ' ~ ' s ' s ' ' s div ' s                                                                                                                                                                                                                                      --대출 시간 반환 날짜, -복귀 시간
...

)


사용되는 기능은 다음과 같습니다.
1. 학생의 학번을 변경하면, 그의 대출 기록이 여전히 이 학생과 관련되어 있기를 바랍니다(즉, 대출 기록 테이블의 학생 ID를 동시에 변경)
2. 학생이 졸업한 경우 해당 학생의 학생 ID를 삭제하고 동시에 대출 기록도 삭제하세요.
잠깐만요.

이때 트리거를 사용할 수 있습니다. 1의 경우 업데이트 트리거를 만듭니다.



트리거 만들기 truStudent
On Student - 업데이트를 위해 Student 테이블

에 트리거 만들기 ​​​​​—이벤트 이유

다음과 같이                                                  — 이벤트가 트리거된 후 수행할 작업                                 > > ~                    . 삽입됨 --삭제 및 임시 테이블 삽입

여기서 br.StudentID=d.StudentID


트리거의 두 임시 테이블인 삭제됨과 삽입됨을 이해합니다. 삭제됨과 삽입됨은 각각 이벤트를 트리거한 테이블의 "이전 레코드"와 "새 레코드"를 나타냅니다.
테이블의 변경 사항을 기록하는 정보를 저장하는 데 사용되는 데이터베이스 튜토리얼 시스템에는 두 개의 가상 테이블이 있습니다.
~                       ​new 저장 기록 없이 기록 추가

기록 업데이트에 사용되는 새 기록 복구

삭제 및 저장 시 일회용 레코드라고 생각하면 됩니다. 삽입된 테이블에 새 레코드를 생성하고, 이전 레코드를 삭제된 테이블에 복사한 다음, 학생 레코드를 삭제하고 새 레코드를 작성합니다.

2의 경우 삭제 트리거를 만듭니다.
트리거 trdStudent

On Student

for 삭제

As

BorrowRecord
BorrowRecord에서 br , Delted d
여기서 br.StudentID=d.StudentID



다음 두 예에서 트리거의 핵심을 확인할 수 있습니다. A. 2개의 임시 테이블 B .Trigger 메커니즘

DML 트리거는 다음과 같이 구분됩니다.

1. 이후 트리거(이후 트리거)

a. 삽입 트리거

업데이트 트리거

c. 트리거 삭제

2. 트리거 대신(트리거 이전)

트리거 이후에는 트리거가 트리거되어야 합니다. 특정 작업 삽입, 업데이트 또는 삭제가 실행된 후에만 해당 테이블에서만 정의할 수 있습니다. 트리거 대신 정의된 작업(삽입, 업데이트, 삭제)을 실행하지 않고 트리거 자체만 실행한다는 의미입니다. 트리거 대신 테이블이나 뷰에서 정의할 수 있습니다.

트리거에는 삽입 테이블(삽입된 테이블)과 삭제 테이블(삭제된 테이블)이라는 두 가지 특수 테이블이 있습니다. 이 두 가지는 논리 테이블과 가상 테이블입니다. 시스템은 메모리에 두 개의 테이블을 생성하고 이를 데이터베이스에 저장하지 않습니다. 또한 두 테이블 모두 읽기 전용이므로 데이터를 읽을 수만 있고 수정할 수는 없습니다. 이 두 테이블의 결과는 항상 수정된 트리거가 적용되는 테이블과 동일한 구조를 갖습니다. 트리거가 작업을 완료하면 두 테이블이 삭제됩니다. Inserted 테이블의 데이터는 삽입 또는 수정 후의 데이터이고, 삭제된 테이블의 데이터는 업데이트 또는 삭제 전의 데이터입니다.

데이터 업데이트 시 테이블 레코드를 먼저 삭제한 후 레코드를 추가합니다. 이런 방식으로 삽입된 테이블과 삭제된 테이블에 업데이트된 데이터 레코드가 있게 됩니다. 트리거 자체는 트랜잭션이므로 트리거의 수정된 데이터에 대해 몇 가지 특별한 검사를 수행할 수 있습니다. 만족스럽지 않은 경우 트랜잭션 롤백을 사용하여 작업을 취소할 수 있습니다.

instead of 触发器

Ø 트리거 생성

구문

create Trigger tgr_name

on table_name

암호화 – 암호화 트리거

업데이트용...

as

Transact-SQL

#삽입 유형 트리거 생성

--삽입 삽입 유형 트리거 생성
(object_id('tgr_classes_insert', 'tr')이 null이 아닌 경우)
클래스에서 트리거 삭제 tgr_classes_insert
go
트리거 tgr_classes_insert 생성

삽입용 --insert 트리거
as
--define 변수
선언 @id int, @name varchar(20), @temp int;
--삽입된 테이블에 쿼리 기록 정보가 삽입되었습니다
select @id = id, @name = 삽입된 이름;
set @name = @name + Convert(varchar, @id);
set @temp = @id / 2;
학생 값(@name, 18 + @id, @temp, @id)에 삽입;
'학생 추가에 성공했습니다! ';
이동
--데이터 삽입
클래스 값에 삽입('5Class', getDate());
-데이터 쿼리
클래스에서 * 선택;
선택 * ID별 학생 주문;

삽입 트리거는 새로 삽입된 레코드를 삽입된 테이블에 추가합니다.

# 삭제 유형 트리거 생성

--delete 삭제 유형 트리거
if (object_id('tgr_classes_delete', 'TR') is not null)
drop Trigger tgr_classes_delete
go
create Trigger tgr_classes_delete
on 클래스
for delete --delete Trigger
as
print
if ( object_id('classesBackup', 'U')는 null이 아닙니다)
--classesBackup이 존재합니다. 데이터를 직접 삽입합니다
ClassBackup에 삽입하여 이름을 선택하고 삭제된 날짜는 create;
else
--존재하지 않습니다. ClassBackup을 생성한 다음 삭제된 클래스 백업에
select *를 삽입하고
'백업 데이터가 성공했습니다!'를 인쇄합니다. ';
go
--
--영향을 받은 행 수를 표시하지 않습니다
--nocount 설정;
name = '5Class'인 클래스 삭제;
-- 데이터 쿼리
select * fromclass;
select * fromclassesBackup;

삭제 트리거는 데이터 삭제 시 방금 삭제된 데이터를 삭제된 테이블에 저장합니다.

# 업데이트 유형 트리거 생성

--업데이트 업데이트 유형 트리거
if (object_id('tgr_classes_update', 'TR') is not null)
드롭 트리거 tgr_classes_update
go
트리거 tgr_classes_update 생성
클래스
업데이트용
as
선언 @oldName varchar(20), @newName varchar(20);
- -업데이트 전 데이터
@oldName = 삭제된 이름 선택;
if(존재(이름이 '%'+ @oldName + '%'와 같은 학생에서 * 선택))
시작
-The 업데이트된 데이터 SELECT @Newname = 삽입된 이름
학생 집합 이름 업데이트 = '%'+ @o ldname + '%'와 같은 이름으로 대체(name, @OLDNAME, @Newname)                                                          > 인쇄 ';
end
else
print '학생 테이블을 수정할 필요가 없습니다! ';
이동
--데이터 쿼리
ID별로 학생 순서에서 * 선택;
수업에서 * 선택;
수업 세트 이름 업데이트 = '수업 5', 여기서 이름 = '수업 5 ';

업데이트 트리거는 데이터 업데이트 후 삽입된 테이블에 업데이트 전 데이터를 저장하고, 삽입된 테이블에 업데이트된 데이터를 저장합니다.

# 업데이트 열 수준 트리거 업데이트

if (object_id('tgr_classes_update_column', 'TR') is not null)

drop Trigger tgr_classes_update_column

go
트리거 tgr_classes_update_column
클래스
for update
as
--column 레벨 트리거: 클래스 생성 시간 업데이트 여부
if (update(createDate))
start
raisError('시스템 프롬프트: 클래스 생성 시간을 수정할 수 없습니다!', 16, 11);
롤백 tran;
end
go
--테스트
select * from 학생 ID별 순서;
클래스에서 * 선택;
클래스 업데이트 createDate = getDate() 여기서 id = 3;
업데이트 클래스 세트 이름 = 'Class 4' where id = 7;

업데이트 열 수준 트리거는 업데이트를 사용하여 열 레코드를 업데이트할지 여부를 결정할 수 있습니다.

작업(삽입, 업데이트, 삭제)은 트리거 자체의 내용만 실행합니다.

문법 만들기

업데이트 대신

table_name에 트리거 tgr_name
생성
암호화
업데이트 대신...
as
T-SQL

# 대신 생성 트리거

if(object_id('tgr_classes_inteadOf', 'TR')가 null이 아님)
대신 tgr_classes_inteadOf
go
트리거 tgr_classes_inteadOf
생성
트리거를 삭제하세요. delete/*, update, insert*/
as
explain @id int, @name varchar(20);
--삭제된 정보 조회, 값 할당
select @id = id , @ name = 삭제된 이름;
print 'id: ' + Convert(varchar, @id) + ', name: ' + @name;
--학생 정보를 먼저 삭제
cid = @인 학생 삭제 id;
--클래스 정보 삭제
id = @id인 클래스 삭제;
print 'Delete [ id: ' + Convert(varchar, @id) + ', name: ' + @name + ' ] 정보가 성공했습니다! ';
이동
--테스트
ID별로 학생 순서에서 * 선택;
수업에서 * 선택;
ID = 7인 수업 삭제;

 

    # 사용자 정의 메시지 표시 raiseerror

if (object_id('tgr_message', 'TR')가 null이 아님)
  drop Trigger tgr_message
go
트리거 tgr_message 만들기
on 학생
삽입 후 업데이트
as raisError('tgr_message 트리거가 트리거됨', 16, 10);
go
--test
학생 값에 삽입('lily', 22, 1, 7);
학생 세트 성별 = 0 업데이트(여기서 이름 = 'lucy');
ID별로 학생 순서에서 * 선택;

# 트리거 수정

alter Trigger tgr_message
학생에서
삭제 후
as raisError('tgr_message Trigger is Triggered', 16, 10);
go
--test
이름 = 'lucy'인 학생에서 삭제 ;

# 트리거 활성화 및 비활성화

--트리거 비활성화
학생에 대해 트리거 tgr_message 비활성화
--트리거 활성화
학생에 대해 트리거 tgr_message 활성화;

# 생성된 트리거 정보 쿼리

--기존 트리거 쿼리
select * from sys.triggers;
select * from sys.objects where type = 'TR';

--트리거 실행 이벤트 보기
sys.trigger_events에서 te.*를 선택하고 t.object_id = te.object_id
에서 sys.triggers t
에 가입하세요. 여기서 t.parent_class = 0 및 t.name = ' tgr_valid_data';

--생성 트리거 문 보기
exec sp_helptext 'tgr_message';

# 예, 삽입된 데이터 확인

if ((object_id('tgr_valid_data', 'TR')은 null이 아닙니다.))
트리거 tgr_valid_data 삭제
go
트리거 tgr_valid_data
생성
삽입 후
as
생성 @age int 선언,
@name varchar(20);
select @name = s.name, @age = 삽입된 s의 s.age;
if (@age < 18)
start
raisError('새 데이터의 연령을 삽입하는 데 문제가 있습니다.', 16, 1);
롤백 tran;
end
go
--test
student에 삽입 값('forest', 2, 0, 7);
학생 값('forest', 22, 0, 7)에 삽입;
ID별로 학생 순서에서 *를 선택;

# 예, 작업 로그

if (object_id('log', 'U')가 null이 아님)
drop table log
go
create table log(
id intidentity( 1, 1) 기본 키,
action varchar(20),
createDate datetime 기본 getDate()
)
go
if (exists ( select * from sys.objects where name = ' tgr_student_log'))
트리거 삭제 tgr_student_log
go
트리거 생성 tgr_student_log
학생
삽입 후, 업데이트, 삭제
as
if ((존재(삽입된 항목에서 1개 선택) )) and (exists (삭제된 항목에서 1개 선택)))
시작
로그(작업) 값에 삽입('업데이트됨');
end
else if (존재함(삽입된 항목에서 1개 선택) 존재하지 않음(삭제된 항목에서 1개 선택))
시작
로그(작업) 값에 삽입('삽입됨');
end
else if( 존재하지 않음(삽입된 항목에서 1개 선택) 및 존재함 (삭제된 항목 중 1개 선택))
시작
로그(액션) 값에 삽입('삭제됨');
end
go
-- 테스트
학생 값에 삽입(' king', 22, 1, 7);
학생 세트 성별 = 0 업데이트(여기서 이름 = 'king');
이름 = 'king'인 학생 삭제;
로그에서 * 선택;
선택 *학생부터 아이디순으로 주문;


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿