본문 바로가기

Database/MS-SQL

땡큐 트리거 TRIGGER 트리거 SQL TRIGGER

반응형
  
하주영 ( [주영] ) 님의 말 :
CREATE TRIGGER testTrg1  --트리거 이름
ON testTbl --트리거를 부착할 테이블
AFTER DELETE, UPDATE --삭제, 수정후에 작동하도록 지정
AS
 PRINT('트리거가 작동했습니다'); -- 트리거 실행시 작동되는 코도들

INSERT INTO testTbl VALUES(4, '당탕이')
UPDATE testTbl SET txt = '우지운' WHERE id = 2
DELETE testTbl WHERE id = 4

SELECT * FROM testTbl

USE sqlDB

CREATE TRIGGER trg_BackupUserTbl --트리거 이름
ON userTbl -- 트리거를 부착할 테이블
AFTER UPDATE, DELETE -- 삭제, 수정 후에 작동하도록 지정
AS
 DECLARE @modType nchar(2) -- 변경 타입

 IF (COLUMNS_UPDATED() > 0) --업데이트 되었다면
  BEGIN
   SET @modType = '수정'
  END
 ELSE --삭제되었다면
  BEGIN
   SET @modType ='삭제'
  END
--delete 테이블의 내용(변경전의 내용)을 백업테이블에 삽입
 INSERT INTO backup_userTbl
  SELECT userID, name, birthYear, addr, mobile1, mobile2, height,
   @modType, GETDATE(), USER_NAME() FROM deleted

SELECT * FROM userTbl

SELECT * FROM userTbl

SELECT * FROM backup_userTbl;



-- 테스트 테이블 및 데이터 입력 (SEQ 가 KEY 인 테이블)

CREATE TABLE TEST (SEQ INT PRIMARY KEY , A BIGINT , B BIGINT)
INSERT INTO TEST VALUES (1,1,1)
INSERT INTO TEST VALUES (2,3,3)

 

-- 트리거 생성 ----------------

CREATE TRIGGER TR_TEST
ON 
AFTER UPDATE
AS
BEGIN
 


DECLARE @SEQ INT
DECLARE @A1 INT, @A2 INT


IF UPDATE (A)         -- A 컬럼이 변경되었을 때만 작동
BEGIN
 SELECT @A1=A FROM DELETED
 SELECT @A2=A FROM INSERTED

 

 IF @A2>@A1   -- 업데이트된 A 컬럼이 업데이트되기전보다 커지게 되면 실행
 BEGIN
  SELECT @SEQ=SEQ FROM INSERTED 
  UPDATE TEST SET B=10000000 WHERE SEQ=@SEQ
 END
END

--------------------------------

 

-- SEQ 가 1인 로우를 업데이트

UPDATE TEST SET A=2 WHERE SEQ=1

 

SELECT * FROM TEST WHERE SEQ=1

--==> B 컬럼 이 10000000 으로 변경된 것으 확인. ^^*


--1.트리거 이용
--
--CREATE TRIGGER Att_Date_Tab_Insert
--
--ON Att_Date_Tab
--AFTER INSERT
--
--AS
--    --여기부터 실행할 내용을 써주면 됩니다.
--
--    Insert into Att_Total_tab (Att_Date, Stu_Num, Stu_K)
--
--    Select (select Att_Date from inserted)
--
--              ,Stu_Num
--
--              ,Null
--
--    From Stu_info_tab
--
--GO
--
-- 
--
--2.프로시져 이용
--
--CREATE PROC Att_Date_Tab_Insert
--
--@v_Att_Date varchar(10)
--
--AS
--
--Insert into Att_Total_tab (Att_Date, Stu_Num, Stu_K)
--
--Select @v_Att_Date
--
--          ,Stu_Num
--
--          ,Null
--
--From Stu_info_tab
--
-- 
--
---실행시
--
--EXEC Att_Date_Tab_Insert '2006-12-15'
--



--
--
--기본적으로 트리거는 하나의 테이블 변경상황에 의하여 트리거링 되기때문에.
--
--두개의 테이블에 의한 트리거링은 조건으로 생성할 수 없습니다.
--
--따라서 원하시는 트리거는 생성이 불가능합니다.
--
--하지만 몇가지 상황적 조건이 충족된다면 테이블2에 UPDATE 트리거를 생성하여 처리가 가능합니다.
--
--1. 테이블 1, 2, 3 이 각 row는 특정 필드값으로 조인이 가능한 상태(테이블간 상호 관계가 존재하여야함)
--
--2. 테이블 1 insert, 테이블 2 a필드 update가 동시에 발생할경우 처리 순서상
--
--    테이블 1 insert 우선 , 테이블 2 a필드 update 나중에 일어나야함.
--
--3. 테이블2 a 값은 테이블1의 로우값과 인과 관계가 존재함. - 다르게 말해서 a값으로 테이블1의 insert 여부를 알수 있음.
--
--   (예, a의 값은 테이블1의 특정 조건의 로우의 개수,  a의 값은 테이블1의 특정 조건의 sum, count, avg 등의 값)
--
--4. 테이블3 b필드에 업데이트 되는 값은 테이블 1의 필드값이나 테이블 2의 필드값 혹은 정의된 상수값이어야 함
--
--5. 테이블1은 insert의 순서를 알수 있는 필드가 존재하여야 함.
--
--즉 테이블2의 a값으로 테이블1의 신규 등록 여부를 알수 있어야 하며 테이블3 b필드가 업데이트될
--
--    row 및 값을 사용자의 조작없이 알수 있는 상태 이면 가능합니다.
--   
--
--예로 다음과 같은 상황이라면
--TABLE1 AA = TABLE2 BB = TABKE3 CC 필드로 연결됨
--TABLE2 a필드는 TABLE2의 BB필드값과 동일한 AA필드 값을 가지고 있는 TABLE1의 '개수' 필드의 합
--TABLE3 b필드는 TABLE1의 AA필드값과 동일한 CC필드 값을 가지고 있는 가장 최근에 입력된 c 필드값
--TABLE1 RDATE는 등록일시의 값을 가짐
--이라고 한다면
--
--
--CREATE OR REPLACE TRIGGER TABLE1_TRIGGER
-- BEFORE
-- UPDATE ON TABLE1
-- FOR EACH ROW
-- DECLARE TABLE_KEY VARCHAR2(100);
-- DECLARE TABLE1_C VARCHAR2(100);
-- DECLARE TABLE1_MAX VARCHAR2(100);
--BEGIN
--
-- TABLE_KEY := old.BB;
-- 
-- IF old.a <> new.a THEN /* a필드값 변경된다는