[Sqlserver 스 크 립 트 시리즈] - 트리거

25653 단어 sqlserver
전송: http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html
 
 
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
 
삭제 할 오래된 기록 저장

좋은 웹페이지 즐겨찾기