2016-11-29 1 views
1

여러 개의 Update/Inserts를 처리 할 TSQL 트리거를 만드는 방법을 연구했습니다.SQL 트리거 다중 삽입 업데이트

우리는 여러 소스에서 오는 데이터를 보유하고 있으며 업데이트/삽입하기 전에 해당 데이터를 확인/수정하는 것이 목표입니다.

데이터의 단일 행에 대해 작동하는 트리거를 작성했습니다.

여러 행의 데이터를 처리하는 방법을 알아 내려고 애 쓰고 있습니다.

CREATE TRIGGER [dbo].[tr_GPTitleToGov] 
ON [dbo].[GoverningPersons] 
AFTER INSERT, UPDATE 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @Title1 VARCHAR(15) 
DECLARE @UBI VARCHAR(9) 
DECLARE @ETPID CHAR(4) 
DECLARE @Ident INT 

SET @Title1 = (SELECT Title1 FROM INSERTED) 
SET @UBI = (SELECT UBI FROM INSERTED) 
SET @ETPID = (SELECT [ETPID] FROM [entity] WHERE @UBI = [entity].[UBI]) 
SET @Ident = (SELECT Ident FROM INSERTED) 

IF ((@Title1 = 'Executor') OR (@Title1 = 'Incorporator')) 
    BEGIN 
     IF @ETPID IN ('0143', '0147', '0148', '0150', '0152', '0154') 
     UPDATE GoverningPersons 
     SET [Title1] = 'Executor', 
      [Title2] = NULL, 
      [Title3] = NULL, 
      [Title4] = NULL 
     WHERE Ident = @Ident; 

     ELSE 
     UPDATE GoverningPersons 
     SET [Title1] = 'Incorporator', 
      [Title2] = NULL, 
      [Title3] = NULL, 
      [Title4] = NULL 
     WHERE Ident = @Ident; 
    END 
ELSE 
    UPDATE GoverningPersons 
    SET [Title1] = 'Governor', 
     [Title2] = NULL, 
     [Title3] = NULL, 
     [Title4] = NULL 
    WHERE Ident = @Ident; 
END 

나를 던지는 것은 필드에 가입하는 곳입니다. 그래서 다른 테이블의 데이터와 데이터를 비교할 수 있습니다.

이전에 트리거를 작성한 적이 없으므로 도움을 받으실 수 있습니다.

답변

3
CREATE TRIGGER [dbo].[tr_GPTitleToGov] 
ON [dbo].[GoverningPersons] 
AFTER UPDATE 
AS 
BEGIN 
SET NOCOUNT ON; 

UPDATE gp 
    SET Title1 = CASE 
      WHEN i.Title1 IN ('Incorporator','Executor') 
       AND e.ETPID IN ('0143', '0147', '0148', '0150', '0152', '0154') THEN 'Executor' 
      WHEN i.Title1 IN ('Incorporator','Executor') THEN 'Incorporator' 
      ELSE 'Governor' 
      END 
     ,Title2 = NULL 
     ,Title3 = NULL 
     ,Title4 = NULL 
FROM 
    GoverningPersons gp 
    INNER JOIN inserted i 
    ON gp.Ident = i.Ident 
    LEFT JOIN entity e 
    ON i.UBI = e.UBI 


END 

트리거 번 행당 오히려 그래서 전체 DML 동작 번만을 실행 된 세트 기반 동작으로서 실행 NOT이다. 따라서 다른 업데이트 날짜와 마찬가지로 join 문을 사용하여 처리해야합니다. 오직 inserteddeleted 테이블을 사용할 수 있습니다. 위의 내용은 업데이트 트리거의 예이며 일부 방향을 제공해야합니다.

+0

감사합니다. 지금 확인해 보겠습니다. –

+0

사례 진술과 같은 것이 있는지 전혀 몰랐습니다. 이것은 최고입니다! –

+0

@ E.Powell'CASE' _expression_은 값을 생성합니다. 'CASE' _statement_가 없습니다. 안타깝게도 Microsoft는이를 이해하지 못하고 "문서"에서 무작위로 용어를 사용합니다. – HABO