質問

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には多数のレコードが挿入され続けます。

同僚と話しましたが、何も問題はないようです! = Sこれに関する手がかりはありますか?私は何か間違っていますか?

事前に感謝=)

役に立ちましたか?

解決

トリガーは設定ベースであるため、
   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)修飾子を広範囲に使用していることに気付きました。複数の行が返される場合、履歴テーブルに複数の行が挿入されます。

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

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

それ以外の場合は、トリガーで何らかの再帰が行われているように見えます。表示されませんが、必要に応じて、データベースオプションであるため、データベース全体の再帰トリガーをオフにできます。

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top