IT_DBMS/MSSQL

트리거 예제

JJun ™ 2006. 3. 9. 15:59




/* 트리거: 한쪽에만 입력해도 양쪽으로 모두 사용이 가능하게 해주는 것으로 생각하자 */

/*          트리거는 직접적으로 호출해서 쓸 수 없다.                              */

/*          트리거는 파라미터를 이용한 프로그래밍을 할 수 없다.                       */

 

use test

 

create table triaaa
(
  id int,
  name varchar(10)
)
/*triaaa 테이블을 만든다*/

 

create table tribbb
(
  id int,
  name varchar(10)
)
/*tribbb 테이블을 만든다*/

 

/*inserted 가상테이블 - 삽입*/
create trigger tri_ins on triaaa
for insert
as
 declare @id int, @name char(10)
 set @id = (select id from inserted)
 set @name = (select name from inserted)

 

 

insert into tribbb (id, name) values (@id, @name)

insert into triaaa values (1,'Kim')
insert into triaaa values (2,'Hyun')
insert into triaaa values (3,'Jun')
/*트리거를 만들었기 때문에 tribbb에도 데이터가 입력된다.*/

 

insert into tribbb values (4,'Chun')
insert into tribbb values (5,'Jae')
/*

   정의에서 triaaa에 입력할때만 tribbb에 넣으라고 정의했기 때문에

   triaaa에는 입력이 되지 않는다.

*/

 

select * from triaaa
select * from tribbb
/*결과확인*/

 

 


/*deleted 가상 테이블 - 삭제*/
create trigger tri_del on triaaa
   for delete
as
   declare @id int
   set @id = (select id from deleted)
  
   delete from tribbb
   where id = @id

 

delete from triaaa where id = 2
/*triaaa와 tribbb 두 테이블 모두 id가 '2'인 값이 삭제된다.*/

delete from tribbb where id = 2
/*

   정의에서 triaaa에 입력할때만 tribbb에 삭제하라고 정의했기 때문에

    triaaa에는 삭제가 되지 않는다.

*/

 

select * from triaaa
select * from tribbb
/*결과확인*/

 


/* inserted 가상테이블 - 수정*/
create trigger tri_upd on triaaa
  for update
as
  declare @id int, @name varchar(10)
  set @id = (select id from inserted)
  set @name = (select name from inserted)

 

  update tribbb
  set name = @name
  where id = @id

 

update triaaa set name = 'Kimm'
where id = 1
/*triaaa와 tribbb 두 테이블 모두 id가 '1'인 값의 name이 'Kimm'으로 수정된다.*/


update tribbb set name = 'Kim'
where id = 1
/*

   정의에서 triaaa에 수정할때만 tribbb에 수정하라고 정의했기 때문에

   triaaa에는 수정이 되지 않는다.

*/

 

select * from triaaa
select * from tribbb
/*결과확인*/

 

 

-- instead of 트리거 --

 

use test

 

create table Triccc
(
  id int identity primary key,
  name char(10)
)

 

insert into Triccc(name)
values ('Hong')

 

select * from Triccc

 

create trigger tri_ccc on triccc
       instead of insert
  as
       rollback
-- instead of 트리거 생성

 

create table Triddd
(
  id int identity primary key,
  name char(10)
)

 

insert into Triddd(name)
values ('Hong')

 

select * from Triddd

 

create trigger tri_ddd on triddd
       for insert
  as
       rollback
-- After 트리거 생성

 

--입력을 해보자
insert into Triccc(name)
values ('Kim')
insert into Triddd(name)
values ('Kim')
insert into Triccc(name)
values ('Lee')
insert into Triddd(name)
values ('Lee')
/*
    결과: 입력이 되지 않는다.

    어떠한 제약조건보다 instead of 트리거가 먼저 실행된다.
    Rollback 명령 때문..
*/

 

select * from Triccc
select * from Triddd

 

--트리거를 지우고 입력해보자
drop trigger Tri_ccc
drop trigger Tri_ddd

 

insert into Triccc(name)
values ('Kim')
insert into Triddd(name)
values ('Kim')
insert into Triccc(name)
values ('Lee')
insert into Triddd(name)
values ('Lee')

 

select * from Triccc
select * from Triddd
/*
   결과: 입력이 된다.
   Triccc id: 1,2,3
   Triddd id: 1,4,5  

*/

 

/* 

   INSTEAD OF Trigger를 설정하면 트리거만 처리될 뿐
   이를 발생시킨 INSERT, DELETE, UPDATE 문은 수행되지 않습니다.
   FOR INSERT, FOR DELETE, FOR UPDATE 대신
   FOR INSTEAD OF INSERT, FOR INSTEAD OF DELETE, FOR INSTEAD OF UPDATE로

   지정하면 됩니다.
   원래 INSTEAD OF 위치에 AFTER를 지정해야 했으나 AFTER는 생략할 수 있으므로

   지금까지 생략하고 사용함.
*/

'IT_DBMS > MSSQL' 카테고리의 다른 글

데이터 베이스 복구방법  (0) 2006.03.14
SQL test  (0) 2006.03.10
트리거(Trigger)  (0) 2006.03.09
사용자 정의 함수  (0) 2006.03.09
함수 작성 구문  (0) 2006.03.09