2016-08-16 5 views
1

나는 하나 개의 테이블에 두 개의 트리거, 삽입에 하나 화재를 가지고삽입 트리거에서 업데이트 할 때 업데이트 트리거 이후 발사하지

CREATE TRIGGER [dbo].[eTteamTg] 
ON [dbo].[entryTable] 
AFTER INSERT 
AS 
BEGIN 
    UPDATE entryTable 
    SET shiftTeam = (SELECT TOP 1 shiftTeamMemb.teamId 
        FROM shiftTeamMemb 
        WHERE shiftTeamMemb.personalNumber = i.personalNumber) 
    FROM entryTable 
    INNER JOIN inserted i ON i.ID = entryTable.ID 
END 

그리고 두 번째 화재 갱신

후 다른 테이블에서 추가 정보와 함께 행을 갱신 내가해야 할 일은
CREATE TRIGGER [dbo].[eThistoryUpdTg] ON [dbo].[entryTable] 
AFTER update 
AS 
BEGIN 
    INSERT INTO eThistory(my columns) 
     SELECT 
      *, HOST_Name() + ' ' + SUSER_NAME() + ' Upd', GETDATE() 
     FROM 
      deleted 
END 

내가 AFTER INSERT 트리거 행을 업데이트하고 때AFTER UPDATE 트리거를 발생하지 이다. 가능한가?

+0

귀하의'삽입 '방아쇠가 부러진 것처럼 보입니다. 하위 쿼리는 상관 관계가 없습니다 ('i'를 참조하려고했던 것보다'inserted'에 대한 별도의 참조가 도입되었습니다). 그래서 다중 행 삽입은 "subquery returned of more 하나의 가치보다 ". –

+0

아, 지금은 질문을 업데이트 @Damien_The_Unbeliever –

+0

죄송합니다, 틀렸어. 그 오류를 반환하지 않습니다. 대신 '최고 1'을 사용하도록 강요했기 때문에 자동으로 데이터가 손상됩니다. 다시 말하면, 그 부질의는 무관계 *입니다. 그래서'inserted'가 * different *'personalNumber' 값을 갖는 * multiple * 행을 포함한다면, 그 값 중 * 하나는'shiftTeamMemb'에서 성공적으로 룩업을 일으키고 원래 삽입 된 모든 * 행은 그 값을받습니다. –

답변

1

나는 하나에이 두 개의 트리거를 병합하는 것이 좋습니다 :

CREATE TRIGGER [dbo].[eTteamTg] 
ON [dbo].[entryTable] 
AFTER INSERT, UPDATE 
AS 
BEGIN 
    UPDATE entryTable 
    SET shiftTeam = (SELECT TOP 1 shiftTeamMemb.teamId 
        FROM shiftTeamMemb 
        WHERE shiftTeamMemb.personalNumber = i.personalNumber) 
    FROM entryTable 
    INNER JOIN inserted i ON i.ID = entryTable.ID 

    INSERT INTO eThistory(my columns) 
    SELECT 
     *, HOST_Name() + ' ' + SUSER_NAME() + ' Upd', GETDATE() 
    FROM 
     deleted 
END 

그런 다음 INSERT 후에는 shiftTeam를 업데이트하고 deleted1이`를 사용하지 않습니다.

업데이트 후 shiftTeam을 업데이트하고 deleted을 사용하여 이전 (심지어 위의 업데이트까지) 값을 가져옵니다.

또는이 테이블에 UPDATE의 경우 shiftTeam를 업데이트 할 필요가없는 경우 IF 문을 추가 할 수 있습니다 :

CREATE TRIGGER [dbo].[eTteamTg] 
ON [dbo].[entryTable] 
AFTER INSERT, UPDATE 
AS 
BEGIN 

    IF (SELECT COUNT(*) FROM deleted) = 0 --That means it was INSERT 
    BEGIN 
     UPDATE entryTable 
     SET shiftTeam = (SELECT TOP 1 shiftTeamMemb.teamId 
         FROM shiftTeamMemb 
         WHERE shiftTeamMemb.personalNumber = i.personalNumber) 
     FROM entryTable 
     INNER JOIN inserted i ON i.ID = entryTable.ID 
    END 

    INSERT INTO eThistory(my columns) 
    SELECT 
     *, HOST_Name() + ' ' + SUSER_NAME() + ' Upd', GETDATE() 
    FROM 
     deleted 
END 
+0

좋아요! 이것은 내가 필요로했던 것과 정확히 같았습니다. 당신이 더 많은 행동을 할 때 같은 방아쇠를 당할 수 있다는 것을 몰랐습니다. 이 방법은 꽤 똑똑합니다. 삽입시에만 업데이트해야하기 때문에 두 번째 방법을 사용해야합니다. –

1

이 같은 두 번째 트리거를 구현,

CREATE TRIGGER [dbo].[eThistoryUpdTg] ON [dbo].[entryTable] 
AFTER UPDATE 
AS 
BEGIN 
    INSERT INTO eThistory (my columns) 
    SELECT * 
     ,HOST_Name() + ' ' + SUSER_NAME() + ' Upd' 
     ,GETDATE() 
    FROM deleted d 
    WHERE NOT EXISTS (
      SELECT TOP 1 shiftTeamMemb.teamId 
      FROM shiftTeamMemb 
      INNER JOIN inserted I ON i.personalNumber = shiftTeamMemb.personalNumber 
      INNER JOIN entryTable E ON E.ID = I.ID 
      WHERE shiftTeamMemb.personalNumber = i.personalNumber 
      ) 
END 
관련 문제