반응형
- /**********************************************************************************************
-- Title : [2k5] 중첩 트리거(Nested Triggers)
-- Reference : hanbitbook.co.kr
-- Key word : nested triggers 트리거 sp_configure is_recursive_triggers_on create
**********************************************************************************************/
use master;
go - drop database triggerdb;
go - create database triggerdb;
go - use triggerdb;
go - -- 중첩 트리거가 되기 위해선 아래 옵션이 on 되어야 한다.
exec sp_configure 'nested triggers'
exec sp_configure 'nested triggers', 1
reconfigure
exec sp_configure 'nested triggers'
go - select * from sys.server_triggers;
go - create table ordertbl -- 구매 테이블
(orderno int identity, -- 구매 일련번호
userid nvarchar(5), -- 구매한 회원아이디
prodname nvarchar(5), -- 구매한 물건
orderamount int ); -- 구매한 개수 - create table prodtbl -- 물품 테이블
( prodname nvarchar(5), -- 물건 이름
account int ); -- 남은 물건수량 - create table delivertbl -- 배송 테이블
( deliverno int identity, -- 배송 일련번호
prodname nvarchar(5), -- 배송할 물건
amount int ); -- 배송할 물건개수
go - insert into prodtbl values('사과', 100);
insert into prodtbl values('배', 100);
insert into prodtbl values('귤', 100);
go - create table recua (id int identity, txt nvarchar(10)); -- 간접 재귀트리거용 테이블a
create table recub (id int identity, txt nvarchar(10)); -- 간접 재귀트리거용 테이블b
create table recuaa (id int identity, txt nvarchar(10)); -- 직접 재귀트리거용 테이블aa
go - -- 물품테이블에서 개수 감소시키는 트리거
create trigger trg_order
on ordertbl
after insert
as
print '1. trg_order를 실행합니다.'
declare @orderamount int
declare @prodname nvarchar(5)
select @orderamount = orderamount from inserted
select @prodname = prodname from inserted
update prodtbl set account = account - @orderamount
where prodname = @prodname ;
go - -- 배송테이블에 새 배송 건을 입력하는 트리거
create trigger trg_prod
on prodtbl
after update
as
print '2. trg_prod를 실행합니다.'
declare @prodname nvarchar(5)
declare @amount int
select @prodname = prodname from inserted
select @amount = d.account - i.account
from inserted i, deleted d -- 변경전의개수- 변경후의개수 = 주문개수
insert into delivertbl(prodname,amount) values(@prodname, @amount);
go - insert into ordertbl values ('john','배',5);
go - select * from ordertbl;
select * from prodtbl;
select * from delivertbl; - exec sp_rename 'dbo.delivertbl.prodname', 'productname', 'column';
- insert into ordertbl values ('dang','사과',9);
--메시지 207, 수준 16, 상태 1, 프로시저 trg_prod, 줄 11
--열 이름 'prodname'이(가) 잘못되었습니다. - select * from ordertbl;
select * from prodtbl;
select * from delivertbl; - use triggerdb;
- select name, is_recursive_triggers_on from sys.databases
where name = 'triggerdb';
반응형