반응형

/**********************************************************************************************
-- Title : [2k5] INSTEAD OF 트리거와 트리거명 변경 및 삭제
-- Reference : hanbitbook.co.kr
-- Key word : drop trigger instead of sp_rename on all server on database
**********************************************************************************************/
use sqldb;
go

create view uv_deliver -- 배송정보를 위한 뷰
as
 select b.userid, u.name, b.prodname, b.price, b.amount, u.addr
 from buytbl b
  inner join usertbl u
  on b.userid = u.userid;
go

select * from uv_deliver;
go

insert into uv_deliver values ('dti', '당탕이', '구두', 50, 1, '인천');
/*
메시지 4405, 수준 16, 상태 1, 줄 2
뷰 또는 함수 'uv_deliver'은(는) 수정 시 여러 기본 테이블에 영향을 주므로 업데이트할 수 없습니다.
*/
go

--뷰에 저장을 못하기에 대신 처리하는 트리거 생성
create trigger trg_insert
on uv_deliver
instead of insert
as
begin
 insert into usertbl(userid, name, birthyear, addr)
  select userid, name, 1900 , addr from inserted
 insert into buytbl(userid, prodname, price, amount)
  select userid, prodname, price, amount from inserted
end;
go

select * from sys.triggers;
select * from sys.server_triggers;
go

insert into uv_deliver values ('dti', '사용자', '구두', 50, 1, '강원')
/*
메시지 2627, 수준 14, 상태 1, 프로시저 trg_insert, 줄 6
primary key 제약 조건 'pk__usertbl__7c8480ae'을(를) 위반했습니다. 개체 'dbo.usertbl'에
중복 키를 삽입할 수 없습니다.
*/
go

select * from usertbl where userid = 'dti';
select * from buytbl where userid = 'dti';
go

exec sp_helptrigger uv_deliver; --isinsteadof 필드 확인
go

exec sp_helptext trg_insert;
go

exec sp_rename 'dbo.trg_insert', 'trg_uvinsert' ; --두번째것에 dbo 사용하면 안된당~!!
go

--메타 확인
select * from sys.sql_modules ;
select * from syscomments;
select object_name(469576711)
go

exec sp_helptext trg_uvinsert;
go

drop trigger dbo.trg_uvinsert;
go

drop view dbo.uv_deliver;
go

--서버 트리거
create trigger ddltrg_server
 on all server
 after create_database, alter_database, drop_database
as
 print ' 경고: 데이터베이스 관련된 작업은 관리자에게 문의하세요.'
 rollback transaction;
go
 
create database testdb;
go
 
drop trigger ddltrg_server on all server;
go
 
use sqldb;
go
 
drop trigger ddltrg_sqldb on database;
go

--instead of 트리거
create table ttt(a int);

create trigger trg_ttt
on dbo.ttt
instead of delete
as
begin
  print '삭제하면 안됑...';
end

반응형

+ Recent posts