/* 트리거: 한쪽에만 입력해도 양쪽으로 모두 사용이 가능하게 해주는 것으로 생각하자 */
/* 트리거는 직접적으로 호출해서 쓸 수 없다. */
/* 트리거는 파라미터를 이용한 프로그래밍을 할 수 없다. */
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 |