[Sqlserver 스 크 립 트 시리즈] - 트리거
25653 단어 sqlserver
SQL Server 트리거
트리거 는 특수 한 유형의 저장 과정 으로 이전에 우리 가 소개 한 저장 과정 과 다르다.트리거 는 주로 이 벤트 를 통 해 트리거 가 자동 으로 호출 되 어 실 행 됩 니 다.저장 프로 세 스 는 저장 프로 세 스 의 이름 을 통 해 호출 될 수 있다.
Ø 트리거 란 무엇 인가
트리거 가 시 계 를 삽입, 업데이트, 삭제 할 때 자동 으로 실행 되 는 특수 저장 과정.트리거 는 일반적으로 check 제약 이 더욱 복잡 한 제약 에 사용 된다.트리거 와 일반적인 저장 과정의 차 이 는 트리거 는 특정한 시 계 를 조작 하 는 것 이다.예 를 들 어 update, insert, delete 등 작업 을 할 때 시스템 은 이 표 에 대응 하 는 트리거 를 자동 으로 호출 합 니 다.SQL Server 2005 에서 트리거 는 두 가지 로 나 눌 수 있 습 니 다. DML 트리거 와 DDL 트리거 입 니 다. 그 중에서 DDL 트리거 는 여러 가지 데이터 정의 언어 문 에 영향 을 주어 자극 할 수 있 습 니 다. 이런 문 구 는 create, alter, drop 문 구 를 가지 고 있 습 니 다.
DML 트리거 는 다음 과 같이 나 뉜 다.
1. after 트리거 (이후 트리거)
a, insert 트리거
b 、 update 트리거
c, delete 트리거
2, instead of 트리거 (이전 트리거)
그 중에서 after 트리거 는 insert, update, delete 를 실행 한 후에 만 트리거 가 실 행 될 수 있 고 표 에 만 정의 할 수 있 습 니 다.대신 instead of 트리거 는 정 의 된 동작 (insert, update, delete) 을 실행 하지 않 고 트리거 자체 만 실행 합 니 다.표 에서 instead of 트리거 를 정의 할 수도 있 고 보기 에서 정의 할 수도 있 습 니 다.
트리거 에는 두 개의 특수 한 시계 가 있 습 니 다. 삽입 표 (instered 표) 와 삭제 표 (deleted 표) 입 니 다.이 두 장 은 논리 표 이자 허표 이다.메모리 에 시스템 을 만 든 두 장의 표 가 있 으 며 데이터베이스 에 저장 되 지 않 습 니 다.그리고 두 장의 표 는 모두 읽 기만 하고 데이터 만 읽 을 수 있 을 뿐 데 이 터 를 수정 할 수 없다.이 두 장의 표 의 결 과 는 항상 트리거 에 응 용 된 표 의 구조 와 같다.트리거 가 작업 을 마 친 후에 이 두 장의 시 계 는 삭 제 될 것 이다.Inserted 표 의 데 이 터 는 삽입 되 거나 수 정 된 데이터 이 며, deleted 표 의 데 이 터 는 업데이트 전 또는 삭 제 된 데이터 입 니 다.
시계 조작
Inserted 논리 표
삭 제 된 논리 표
기록 추가 (insert)
추가 기록 저장
없다
기록 삭제 (delete)
없다
삭 제 된 기록 저장
기록 수정 (update)
업 데 이 트 된 기록 저장
업데이트 전 기록 저장
데 이 터 를 업데이트 할 때 는 표 기록 을 삭제 한 다음 기록 을 추가 하 는 것 입 니 다.이렇게 하면 inserted 와 deleted 표 에 모두 update 후의 데이터 기록 이 있 습 니 다.주의 하 는 것 은 트리거 자체 가 하나의 업무 이기 때문에 트리거 에서 수정 데 이 터 를 특수 하 게 검사 할 수 있 습 니 다.만족 하지 않 으 면 트 랜 잭 션 을 이용 하여 스크롤 백 을 취소 할 수 있 습 니 다.
Ø 트리거 생 성
문법
create trigger tgr_name on table_name with encrypion – for update... as Transact-SQL
# insert 형식 트리거 만 들 기
-- insert if (object_id('tgr_classes_insert', 'tr') is not null) drop trigger tgr_classes_insert go create trigger tgr_classes_insert on classes for insert -- as -- declare @id int, @name varchar(20), @temp int; -- inserted select @id = id, @name = name from inserted; set @name = @name + convert(varchar, @id); set @temp = @id / 2; insert into student values(@name, 18 + @id, @temp, @id); print ' !'; go -- insert into classes values('5 ', getDate()); -- select * from classes; select * from student order by id;
insert 트리거 는 inserted 표 에 방금 삽 입 된 기록 을 추가 합 니 다.
# delete 형식 트리거 만 들 기
--delete if (object_id('tgr_classes_delete', 'TR') is not null) drop trigger tgr_classes_delete go create trigger tgr_classes_delete on classes for delete -- as print ' ……'; if (object_id('classesBackup', 'U') is not null) -- classesBackup, insert into classesBackup select name, createDate from deleted; else -- classesBackup select * into classesBackup from deleted; print ' !'; go -- -- --set nocount on; delete classes where name = '5 '; -- select * from classes; select * from classesBackup;
delete 트리거 는 데 이 터 를 삭제 할 때 방금 삭 제 된 데 이 터 를 deleted 표 에 저장 합 니 다.
# update 형식 트리거 만 들 기
--update if (object_id('tgr_classes_update', 'TR') is not null) drop trigger tgr_classes_update go create trigger tgr_classes_update on classes for update as declare @oldName varchar(20), @newName varchar(20); -- select @oldName = name from deleted; if (exists (select * from student where name like '%'+ @oldName + '%')) begin -- select @newName = name from inserted; update student set name = replace(name, @oldName, @newName) where name like '%'+ @oldName + '%'; print ' !'; end else print ' student !'; go -- select * from student order by id; select * from classes; update classes set name = ' ' where name = '5 ';
update 트리거 는 데 이 터 를 업데이트 한 후 업데이트 전 데 이 터 를 deleted 표 에 저장 하고 업 데 이 트 된 데 이 터 는 inserted 표 에 저장 합 니 다.
# update 열 트리거 업데이트
if (object_id('tgr_classes_update_column', 'TR') is not null) drop trigger tgr_classes_update_column go create trigger tgr_classes_update_column on classes for update as -- : if (update(createDate)) begin raisError(' : !', 16, 11); rollback tran; end go -- select * from student order by id; select * from classes; update classes set createDate = getDate() where id = 3; update classes set name = ' ' where id = 7;
열 레벨 트리거 를 업데이트 하면 업데이트 열 기록 을 업데이트 할 지 여 부 를 update 로 판단 할 수 있 습 니 다.
# instead 대신 of type 타 입 트리거
instead of 트리거 는 정 의 된 동작 (insert, update, delete) 을 실행 하지 않 고 트리거 자체 의 내용 만 수행 합 니 다.
문법 만 들 기
create trigger tgr_name on table_name with encryption instead of update... as T-SQL
# 트리거 대신 생 성
if (object_id('tgr_classes_inteadOf', 'TR') is not null) drop trigger tgr_classes_inteadOf go create trigger tgr_classes_inteadOf on classes instead of delete/*, update, insert*/ as declare @id int, @name varchar(20); -- , select @id = id, @name = name from deleted; print 'id: ' + convert(varchar, @id) + ', name: ' + @name; -- student delete student where cid = @id; -- classes delete classes where id = @id; print ' [ id: ' + convert(varchar, @id) + ', name: ' + @name + ' ] !'; go --test select * from student order by id; select * from classes; delete classes where id = 7;
# 사용자 정의 메시지 표시 raisorror
if (object_id('tgr_message', 'TR') is not null) drop trigger tgr_message go create trigger tgr_message on student after insert, update as raisError('tgr_message ', 16, 10); go --test insert into student values('lily', 22, 1, 7); update student set sex = 0 where name = 'lucy'; select * from student order by id;
# 트리거 수정
alter trigger tgr_message on student after delete as raisError('tgr_message ', 16, 10); go --test delete from student where name = 'lucy';
# 트리거 사용, 비활성화
-- disable trigger tgr_message on student; -- enable trigger tgr_message on student;
# 만 든 트리거 정보 조회
-- select * from sys.triggers; select * from sys.objects where type = 'TR';
-- select te.* from sys.trigger_events te join sys.triggers t on t.object_id = te.object_id where t.parent_class = 0 and t.name = 'tgr_valid_data';
-- exec sp_helptext 'tgr_message';
# 예제, 삽입 데이터 검증
if ((object_id('tgr_valid_data', 'TR') is not null)) drop trigger tgr_valid_data go create trigger tgr_valid_data on student after insert as declare @age int, @name varchar(20); select @name = s.name, @age = s.age from inserted s; if (@age < 18) begin raisError(' age ', 16, 1); rollback tran; end go --test insert into student values('forest', 2, 0, 7); insert into student values('forest', 22, 0, 7); select * from student order by id;
# 예제
if (object_id('log', 'U') is not null) drop table log go create table log( id int identity(1, 1) primary key, action varchar(20), createDate datetime default getDate() ) go if (exists (select * from sys.objects where name = 'tgr_student_log')) drop trigger tgr_student_log go create trigger tgr_student_log on student after insert, update, delete as if ((exists (select 1 from inserted)) and (exists (select 1 from deleted))) begin insert into log(action) values('updated'); end else if (exists (select 1 from inserted) and not exists (select 1 from deleted)) begin insert into log(action) values('inserted'); end else if (not exists (select 1 from inserted) and exists (select 1 from deleted)) begin insert into log(action) values('deleted'); end go --test insert into student values('king', 22, 1, 7); update student set sex = 0 where name = 'king'; delete student where name = 'king'; select * from log; select * from student order by id;
트리거 동작 활성화
삽 입 된 시계
삭 제 된 시계
Insert
삽입 할 기록 저장
Update
업데이트 할 기록 저장
업데이트 전 기록 저장
Delete
삭제 할 오래된 기록 저장
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
우분투에 SQL 서버 설치Microsoft SQL Server는 오늘날 업계에서 가장 눈에 띄는 데이터베이스 중 하나입니다. 이번 포스팅에서는 우분투에 설치하는 방법을 알려드리겠습니다. sudo 권한이 있는 계정 1단계: 터미널 열기 단축키...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.