2009-03-05 7 views
0

私はSQL Server 2000のテーブルでトリガを持っている、これが引き金である:SQL Server 2000の奇数挿入トリガ動作 - 再帰のように

ALTER Trigger [dbo].[Set_Asignado_State] ON [dbo].[Tables] 
FOR INSERT AS 
BEGIN   
    DECLARE @area varchar(1) 
    SELECT @area = Table_Area_ID FROM inserted 

    IF (@area = 'L') 
    BEGIN 
     INSERT INTO Table_History 
     SELECT (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AS Table_Area_Id, 
       (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2)) AS Table_Year, 
       (SELECT TOP 1 Table_Seq AS Table_Seq FROM inserted) AS Table_Seq, 
       (SELECT TOP 1 ID FROM Table_Status WHERE Description = 'Asignado') AS Status, 
       '' AS Responsible, 
       (SELECT TOP 1 OrigDept FROM inserted) AS User_Responsible, 
       GETDATE() AS [DateTime], 
       'None' AS Comments 
     FROM Tables 
     WHERE Tables.Table_Area_Id = (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AND 
       Tables.Table_Year = (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2)) 

     IF @@ERROR <> 0 
     BEGIN 
      DECLARE @errorMsg NVARCHAR(256) 
      SET @errorMsg = @@ERROR; 

      PRINT 'Error Inserting in Table_History' 

     END 
    END 
END 

、彼らは「表」でレコードを挿入すると、トリガが呼び出されますが、Table_Historyに多くのレコードが挿入され続けます。

私は仲間と話をしましたが、何も間違っているようです!これについての手がかりは?私は何か間違っているのですか?事前に

感謝=)

+0

@Hugo:多分あなたはそれが何をすべきかを言葉で説明することができますか? –

+0

はさみで走っています... – dkretz

+0

合意しましたが、誰かが走りたいと思ったら、可能な副作用を最小限に抑えることができるはずです –

答えて

0

トリガはこれだけ挿入テーブルから最初のレコードを見ていきます IF (@area = 'L')
をやって、基づいて設定されています。チェックをWHERE句の一部として追加してみてください:

WHERE Tables.Table_Area_Id = (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AND 
       Tables.Table_Year = (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2)) 
AND SUBSTRING(Tables.Table_Area_Id, 1, 1) = 'L' 

メインのSelect文は1行だけを返しますか? Top(1)修飾子を広範囲に使用していることに気付きました。複数の行が返された場合は、履歴テーブルに複数の行が挿入されます。

はおそらく、ブラインドショットとして、最も外側の選択のために(1)トップに入れてみてください:

INSERT INTO Table_History 
    SELECT TOP(1) (SELECT TOP 1 ... 

あなたには、いくつかの再帰が引き金に起こっているかのようにそれ以外の場合は、見えます。私はそれを見ることはできませんが、データベースオプションであるため、必要に応じてデータベース全体の再帰トリガをオフにすることができます。

+0

遅れて申し訳ありませんが、私は優先順位の高い別のものを修正しなければなりませんでした。これをテストしてそのことを知らせますが、これが答えになると思います。おかげで再び男=) – Hugo

+0

それはアンソニーを働いた!ありがとう、たくさんの男! =) – Hugo

0

を表に挿入するのthats Table_Historyテーブル上の別のトリガーがありますか?

関連する問題