-- ★ 트리거(TRIGGER)란?
-- 총의 방아쇠를 당기면 총알을 발사하듯이
-- 테이블에 특정 쿼리문(INSERT, UPDATE, DELETE)을
-- 수행할 경우에 자동으로 어떤일을 하도록 만드는 것
-- (주의 : SELECT 일 경우에는 TRIGGER 적용 안됨)
-
- CREATE TRIGGER 트리거명
- ON 대상이 되는 테이블
- FOR (INSERT, UPDATE, DELETE)
- AS
-
-
- CREATE TABLE T1
- (
- NUM INT,
- NAME VARCHAR(10)
- )
- SELECT * FROM T1
-
-
- IF EXISTS(SELECT * FROM SYSOBJECTS WHERE TYPE = 'TR' AND NAME = 'TRG_01')
- DROP TRIGGER TRG_01
-
- CREATE TRIGGER TRG_01
- ON T1
- FOR INSERT
- AS
- PRINT 'T1 테이블에 1개의 데이터가 등록되었습니다'
- INSERT T1 VALUES(2, '나나나')
-
-
- CREATE TRIGGER TRG_011
- ON T1
- FOR INSERT, UPDATE
- AS
- SELECT * FROM T1
- INSERT T1 VALUES(3, '다다다')
-
-
- SELECT * FROM SYSOBJECTS WHERE TYPE = 'TR'
-
-
-
- SELECT * FROM T1
- SELECT * FROM T2
- CREATE TABLE T2
- (
- NUM INT,
- NAME VARCHAR(10)
- )
-
-
-
-
-
- IF EXISTS(SELECT * FROM SYSOBJECTS WHERE TYPE = 'TR' AND NAME ='TRG_02_1')
- DROP TRIGGER TRG_02_1
-
- CREATE TRIGGER TRG_02_1
- ON T1
- FOR INSERT
- AS
- DECLARE @NUM INT, @NAME VARCHAR(10)
- SET @NUM = (SELECT NUM FROM INSERTED)
- SET @NAME = (SELECT NAME FROM INSERTED)
- INSERT T2 VALUES (@NUM, @NAME)
-
- CREATE TRIGGER TRG_02_2
- ON T1
- FOR INSERT
- AS
- INSERT INTO T2 SELECT * FROM INSERTED
-
- INSERT T1 VALUES (12, 'AAA')
- SELECT * FROM T1
- SELECT * FROM T2
-- ★ TRIGGER 형식
CREATE TRIGGER 트리거명
on 대상이 되는 테이블
FOR (INSERT, UPDATE, DELETE)
AS
-- 수행해야 하는 일들
CREATE TABLE T1
(
NUM INT,
NAME VARCHAR(10)
)
SELECT * FROM T1
-- 등록하고자 하는 트리거가 존재한다면 해당 트리거 삭제
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE TYPE = 'TR' AND NAME = 'TRG_01')
DROP TRIGGER TRG_01
-- INSERT 문이 실행될때 특정 문장 출력해주는 트리거
CREATE TRIGGER TRG_01
on T1
FOR INSERT
AS
PRINT 'T1 테이블에 1개의 데이터가 등록되었습니다'
INSERT T1 VALUES(2, '나나나')
-- INSERT 문이 실행되면 테이블 셀렉트 해오는 트리거
CREATE TRIGGER TRG_011
on T1
FOR INSERT, UPDATE
AS
SELECT * FROM T1
INSERT T1 VALUES(3, '다다다')
-- 트리거 등록 확인
SELECT * FROM SYSOBJECTS WHERE TYPE = 'TR'
--> TYPE = TR -> 트리거
--> TYPE = P -> 프로시저
SELECT * FROM T1
SELECT * FROM T2
CREATE TABLE T2
(
NUM INT,
NAME VARCHAR(10)
)
-- ★ INSERTED, DELETED 테이블 : 트리거가 실행될때 메모리상에만 임시로 저장되는 테이블
-- ★ UPDATED 테이블은 있는가? 없다. 업데이트시에도 INSERTED나 DELETED 테이블!!
-- T1 테이블 데이터 삽입시 T2 테이블에도 삽입해주는 트리거
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE TYPE = 'TR' AND NAME ='TRG_02_1')
DROP TRIGGER TRG_02_1
-- 1번째 방법 (비추 : 컬럼수가 늘어나거나 여러번 삽입시)
CREATE TRIGGER TRG_02_1
on T1
FOR INSERT
AS
DECLARE @NUM INT, @NAME VARCHAR(10)
SET @NUM = (SELECT NUM FROM INSERTED)
SET @NAME = (SELECT NAME FROM INSERTED)
INSERT T2 VALUES (@NUM, @NAME)
-- ★ 2번째 방법(강추)
CREATE TRIGGER TRG_02_2
on T1
FOR INSERT
AS
INSERT INTO T2 SELECT * FROM INSERTED
-- 삽입후 결과확인
INSERT T1 VALUES (12, 'AAA')
SELECT * FROM T1
SELECT * FROM T2
트리거 연습문제..
-
-
-
-
-
-
-
- 강남구 서울시
-
- n(varchar(20)) |phone(char(9)) |n(varchar(20)) |phone(char(9))
-
- | | |
-
-
- CREATE TABLE TEL_KANGNAM
- (
- N VARCHAR(20),
- PHONE CHAR(9)
- )
- CREATE TABLE TEL_SEOUL
- (
- N VARCHAR(20),
- PHONE CHAR(9)
- )
-
- CREATE TRIGGER TRG_TEL_INSERT
- ON TEL_KANGNAM
- FOR INSERT
- AS
- INSERT INTO TEL_SEOUL SELECT * FROM INSERTED
-
- INSERT TEL_KANGNAM VALUES('AAA', '111-1111')
- INSERT TEL_KANGNAM VALUES('BBB', '222-2222')
- INSERT TEL_KANGNAM VALUES('CCC', '333-3333')
-
- SELECT * FROM TEL_KANGNAM
- SELECT * FROM TEL_SEOUL
-
-
- CREATE TRIGGER TRG_TEL_UPDATE
- ON TEL_KANGNAM
- FOR UPDATE
- AS
- IF UPDATE(N)
- BEGIN
- UPDATE TEL_SEOUL SET TEL_SEOUL.N = INSERTED.N
- FROM TEL_SEOUL, INSERTED
- WHERE TEL_SEOUL.PHONE = INSERTED.PHONE
- END
- ELSE IF UPDATE(PHONE)
- BEGIN
- UPDATE TEL_SEOUL SET TEL_SEOUL.PHONE = INSERTED.PHONE
- FROM TEL_SEOUL, INSERTED
- WHERE TEL_SEOUL.N = INSERTED.N
- END
-
- UPDATE TEL_KANGNAM SET N = '111' WHERE N= 'AAA'
- UPDATE TEL_KANGNAM SET N = 'AAA' WHERE N= '111'
- UPDATE TEL_KANGNAM SET PHONE = '444-4444' WHERE PHONE = '111-1111'
- UPDATE TEL_KANGNAM SET PHONE = '111-1111' WHERE PHONE = '444-4444'
-
- SELECT * FROM TEL_KANGNAM
- SELECT * FROM TEL_SEOUL
-
-
- CREATE TRIGGER TRG_TEL_DELETE
- ON TEL_KANGNAM
- FOR DELETE
- AS
- DELETE TEL_SEOUL WHERE N IN (SELECT N FROM DELETED)
-
- BEGIN TRAN
- DELETE TEL_KANGNAM WHERE N = 'BBB'
- SELECT * FROM TEL_KANGNAM
- SELECT * FROM TEL_SEOUL
- ROLLBACK
-
-
-
-
-
- CREATE TRIGGER TRG_EMP_EVENT
- ON EMP
- FOR INSERT, UPDATE, DELETE
- AS
- DECLARE @IFLAG INT, @DFLAG INT
- SET @IFLAG = (SELECT COUNT(*) FROM INSERTED)
- SET @DFLAG = (SELECT COUNT(*) FROM DELETED)
- IF (@IFLAG = 1 AND @DFLAG = 0)
- BEGIN PRINT '데이터가 입력되었습니다.' RETURN END
- IF (@IFLAG = 0 AND @DFLAG = 1)
- BEGIN PRINT '데이터가 삭제되었습니다.' RETURN END
- IF (@IFLAG = 1 AND @DFLAG = 1)
- BEGIN PRINT '데이터가 변경되었습니다.' RETURN END
-
- BEGIN TRAN
- INSERT EMP VALUES(7999, 'JOHN', 'CLERK', 7788, GETDATE(), 1111, NULL, 20)
- UPDATE EMP SET EMPNO = 1111 WHERE EMPNO= 7876
- DELETE EMP WHERE EMPNO=7876
- SELECT * FROM EMP ORDER BY HIREDATE DESC
- ROLLBACK
-
-
-
-
-
- CREATE TRIGGER TRG_DELETE_CALL
- ON BONUS
- FOR DELETE
- AS
- PRINT '데이터를 삭제했습니다' RETURN