ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 땡큐 트리거 TRIGGER 트리거 SQL TRIGGER
    Database/MS-SQL 2009. 2. 24. 19:29
    반응형
      
    하주영 ( [주영] ) 님의 말 :
    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필드값 변경된다는

    반응형

    댓글

Designed by Tistory.