2016-08-16 18 views
1

私は1つのテーブル上の2つのトリガー、挿入時に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 

2つ目の火災の更新

後に他のテーブルから追加情報を持つ行を更新私がする必要がどのような
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

、このようなあなたの第2のトリガを実装'トリガーが壊れているように見えます。サブクエリは無関係です(これは、あなたがしようとしていた、 'i'を参照しているものではなく、' inserted'への別の参照を導入しています)ので、複数行の挿入は、 1つの値よりも大きい "。 –

+0

ああ、私は今、質問を更新@Damien_The_Unbeliever –

+0

申し訳ありませんが、間違っていた。そのエラーは返されません。代わりに、あなたは 'トップ1 'にそれを強制したので、あなたのデータを黙って壊します。このサブクエリは* uncorrelated *です。したがって、 'inserted'に* different *' personalNumber'値を持つ* multiple *行が含まれていると、それらの値の* one *は 'shiftTeamMemb'でルックアップを成功させ、*挿入された*すべての行がその値を受け取ります。 –

答えて

1

私はあなたが一つにこの2つのトリガをマージすることをお勧め:

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 

は、[挿入後に、それはshiftTeamを更新すると `deleted1は使用されません。

更新後、それはshiftTeamを更新し、deletedを使用して前の(さらに上の更新まで)値を取得します。

それとも、あなたがIF文を追加することができ、このテーブルにUPDATEの場合はshiftTeamを更新する必要がない場合:

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

素晴らしい!これはまさに私が必要としていたものでした。私はあなたがより多くの行動に対して同じトリガーをすることができるのか分かりませんでした。この方法はかなり賢いです。 2番目の方法を使用する必要があります。なぜなら、挿入時にのみ更新する必要があるからです –

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 
関連する問題