MY MEMO

[SQL SERVER] Trigger 본문

STUDYING/SQL SERVER

[SQL SERVER] Trigger

l_j_yeon 2018. 3. 19. 15:59

(실무에서는 거의 사용하지 않음)

Trigger : 방아쇠라는 뜻으로 테이블에 무슨 일이 일어나면 자동으로 실행 -> 삽입 수정 삭제 등을 실행

ex) 테이블에 행을 고의 또는 실수로 삭제한다면 테이블에 행이 삭제되는 순간에 행의 내용/시간/삭제/사용자를 기록


1) AFTER TRIGGER

: INSERT, UPDATE, DELETE 등의 작업이 일어났을 때 작동하는 트리거


+) deleted 라는 table이 system에 존재 -> 삭제되는 모든 내용이 있음 & inserted : insert 했을 모든 데이터가 입력되어있음

INSERT가 실행 : inserted 테이블에 삽입

UPDATE가 실행 : 원래의 데이터 -> inserted / 삭제된 데이터 -> deleted


CREATE TRIGGER trg_insertUserTbl

ON userTbl

AFTER INSERT

AS

RAISEERROR(N'데이터의 입력 시도',10,1);

ROLLBACK TRAN;

: 데이터를 삽입하면 안되는데 삽입을 시도했을 때


CREATE TRIGGER testTrg

ON testTbl

AFTER DELETE, UPDATE

AS

INSERT INTO backup_userTbl

SELECT * FROM deleted;


: Trigger를 생성


2) INSTEAD OF TRIGGER

: 이벤트가 발생하기 전에 작동 / 뷰에도 작동 -> View Update 기능 / INSERT, UPDATE, DELETE 대신에 INSTEAD OF 트리거가 작동


복합뷰에서는 INSERT, DELETE, UPDATE가 작동하지 않는다

하지만 INSTEAD OF TRIGGER를 만들어서 고객을 입력하면 자동으로 View에 INSERT되게 만들 수 있다.


INSERT INTO uv_deliver VALUES ('JBI,N'이름',N'구두',50,1,N'인천');

GO

CREATE TRIGGER trg_insert

ON uv_deliver

INSTEAD OF INSERT

AS

BEGIN

INSERT INTO usrTbl(userid, name, addr)

SELECT userid,name,addr FROM inserted;

INSERT INTO buyTbl(userid, name, price)

SELECT userid, name, price FROM inserted;

END;

: 복합뷰와 Trigger를 이용하여 insert, update, delete를 만들기


EXEC sp_helptrigger uv_deliver;

: trigger의 정보를 확인할 수 있음


EXEC sp_helptext trig_insert;

: trigger에 입력되는 내용들을 text로 보여줌


EXEC sp_rename 'dbo.trg_insert', 'dbo.gri_uvInsert';

: trigger의 이름 바꾸기

But 이름이 바뀌긴 하지만 실제로 카탈로그에는 바뀌어 있지 않다 => 쓰지 맙시다

ex) SELECT * FROM sys.sql_modules; // 를 실행하면 볼 수 있다!


+) table이나 view를 삭제하면 거기에 부착된 trigger가 함께 삭제된다


1) 다중 트리거

: 하나의 테이블에 동일한 트리거가 여러개 부착


2) 중첩 트리거

: 한 트리거가 또 다른 트리거를 작동시키는 것


3) 재귀 트리거

: 트리거가 작동해서 다시 자신의 트리거를 작동시키는 것

=> RECURSIVE_TRIGGERS


+) 트리거는 작동 순서를 지정할 수는 없지만 처음과 끝은 가능하다

sp_settriggerorder @triggername = 'dbo.trgA', @order='First(or LAST)',@stmttype='INSERT';








Comments