SQL

[MSSQL]Merge문으로 insert/update/delete트리거 만들기

하루종일v 2017. 12. 19. 15:57

USE [WEIGHDB]
GO
/****** Object:  Trigger [dbo].[TB_CUSTO_IUD]    Script Date: 2017-12-19 오후 3:48:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:
-- Create date:
-- Description: 
-- =============================================
ALTER TRIGGER [dbo].[TB_CUSTO_IUD]        -- 트리거명
    ON  [dbo].[TB_CUSTO]                         -- 트리거만들 테이블
    AFTER INSERT,DELETE,UPDATE               -- 트리거가 실행될 조건
AS 
BEGIN

SET NOCOUNT ON;
        

DECLARE @CUSTONO varchar(15)        -- 변수 선언
DECLARE @V_CUSTONO varchar(15)
DECLARE @V_CUSTONM varchar(50)
DECLARE @V_Rem1 varchar(100)
DECLARE @EVT_TYPE varchar(1)

 

IF(COLUMNS_UPDATED() > 0)            -- COLUMNS_UPDATED는 insert와 update시 실행
    BEGIN
        SET @EVT_TYPE = 'U'                                                                                                   -- 변수에 Set하여 값을 넣어준다.
        SELECT @V_CUSTONO = CUSTONO, @V_CUSTONM = CUSTONM, @V_Rem1 = Rem1  FROM inserted       -- 입력, 수정된값을 가져온다.
    END
ELSE
    BEGIN

  SET @EVT_TYPE = 'D'

  SELECT @V_CUSTONO = CUSTONO, @V_CUSTONM = CUSTONM, @V_Rem1 = Rem1 FROM deleted            -- 수정, 삭제된 값을 가져온다.

    END

 

BEGIN

MERGE INTO TB_CUSTO_IF CUSTO_IF
    USING (SELECT @V_CUSTONO, @V_CUSTONM, @V_Rem1) CUSTO (CUSTONO, CUSTONM, Rem1)
    ON (CUSTO_IF.CUSTONO =  @V_CUSTONO)                                 -- 위 USING은 오라클에서 SELECT FROM DUAL을 이렇게 대체했다.
    WHEN MATCHED THEN                                                            -- ON조건에 따라 UPDATE & INSERT 문 각각 실행한다.
        UPDATE SET
                    CUSTONM = CUSTO.CUSTONM,
                    REM  = CUSTO.Rem1,
                    IF_YN = 'N',
                    EVT_TYPE= @EVT_TYPE
    WHEN NOT MATCHED THEN
        INSERT (CUSTONO,
                   CUSTONM,
                   REM,
                   IF_YN,
                   EVT_TYPE)
       VALUES (CUSTO.CUSTONO,
                   CUSTO.CUSTONM,
                   CUSTO.Rem1,
                   'N',
                   @EVT_TYPE);

END

END

반응형