반응형
  1. /**********************************************************************************************
    -- Title : [2k5] 중첩 트리거(Nested Triggers)
    -- Reference : hanbitbook.co.kr
    -- Key word :  nested triggers 트리거 sp_configure is_recursive_triggers_on create
    **********************************************************************************************/
    use master;
    go
  2. drop database triggerdb;
    go
  3. create database triggerdb;
    go
  4. use triggerdb;
    go
  5. -- 중첩 트리거가 되기 위해선 아래 옵션이 on 되어야 한다.
    exec sp_configure 'nested triggers'
    exec sp_configure 'nested triggers', 1
    reconfigure
    exec sp_configure 'nested triggers'
    go
  6. select * from sys.server_triggers;
    go
  7. create table ordertbl -- 구매 테이블
     (orderno int identity, -- 구매 일련번호
            userid nvarchar(5), -- 구매한 회원아이디
      prodname nvarchar(5), -- 구매한 물건
      orderamount int );  -- 구매한 개수
  8. create table prodtbl -- 물품 테이블
     ( prodname nvarchar(5), -- 물건 이름
       account int ); -- 남은 물건수량
  9. create table delivertbl -- 배송 테이블
     ( deliverno  int identity, -- 배송 일련번호
       prodname nvarchar(5), -- 배송할 물건  
       amount int ); -- 배송할 물건개수
    go
  10. insert into prodtbl values('사과', 100);
    insert into prodtbl values('배', 100);
    insert into prodtbl values('귤', 100);
    go
  11. 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
  12. -- 물품테이블에서 개수 감소시키는 트리거
    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
  13. -- 배송테이블에 새 배송 건을 입력하는 트리거
    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
  14. insert into ordertbl values ('john','배',5);
    go
  15. select * from ordertbl;
    select * from prodtbl;
    select * from delivertbl;
  16. exec sp_rename 'dbo.delivertbl.prodname', 'productname', 'column';
  17. insert into ordertbl values ('dang','사과',9);
    --메시지 207, 수준 16, 상태 1, 프로시저 trg_prod, 줄 11
    --열 이름 'prodname'이(가) 잘못되었습니다.
  18. select * from ordertbl;
    select * from prodtbl;
    select * from delivertbl;
  19. use triggerdb;
  20. select name, is_recursive_triggers_on from sys.databases
     where name = 'triggerdb';

반응형

+ Recent posts