4

以下は私のトリガーです:

ALTER TRIGGER [dbo].[trgPaxeDeleted]
   ON  [dbo].[paxe] 
   AFTER DELETE
AS 
declare
@HFflightID int,
@RFflightID int

BEGIN
        Select @HFflightID = hfFlightID, @RFflightID = rfFlightID from deleted

        -- Hinflug: flugKontingent hochsetzen --   
        UPDATE    flightdata
        SET       flightQuota = flightQuota + 1
        WHERE     (flightID = @HFflightID)

        -- Rückflug: flugKontingent hochsetzen --
        UPDATE    flightdata
        SET       flightQuota = flightQuota + 1
        WHERE     (flightID = @RFflightID)

END

これは、単一の行を削除する場合に正常に機能します。ただし、複数の行を削除する場合は、1つのトリガー操作のみが実行されます。

これを変更するにはどうすればよいですか?

4

5 に答える 5

10

SQL Server トリガーは、すべての行に対してトリガーの 1 つのインスタンスを起動します。テーブルにはdeleted更新されるすべての行が含まれるため、単一のインスタンスを変数に格納することはできません。

次のコード行を削除します。

Select @HFflightID = hfFlightID, @RFflightID = rfFlightID from deleted     

update ステートメントは次のようになります。

UPDATE    flightdata         
SET       flightQuota = flightQuota + 1         
WHERE     flightID IN (SELECT hfFlightID FROM deleted)

UPDATE    flightdata         
SET       flightQuota = flightQuota + 1         
WHERE     flightID IN (SELECT rfFlightID FROM deleted)
于 2012-07-19T18:17:56.150 に答える
1

複数の行を削除できます。ただし、複数のIDを入力する必要があります。例えば:

DELETE FROM  VisitorMaster WHERE Id=85 or Id=86 
于 2012-12-27T12:25:55.183 に答える
0

削除トリガーがに変更されました

ALTER TRIGGER [dbo].[trgPaxeDeleted]
   ON  [dbo].[paxe] 
   AFTER DELETE
AS 
declare
@HFflightID int,
@RFflightID int

BEGIN

    SET NOCOUNT ON;     

    UPDATE    flightdata         
    SET       flightQuota = flightQuota + 1         
    WHERE     flightID IN (SELECT hfFlightID FROM deleted)

        UPDATE    flightdata         
    SET       flightQuota = flightQuota + 1         
    WHERE     flightID IN (SELECT rfFlightID FROM deleted)

END
于 2012-07-19T19:02:25.160 に答える
0

私は同じ問題に直面していましたが、簡単な解決策を見つけました。

最初に、削除された列を格納するトリガー テーブルを作成しました

CREATE TABLE dbo.XLogs (
  Field1 varchar(30),
  Field2 varchar(30),
  Field3 varchar(30),
  Field4 varchar(30),
  Field5 varchar(2)
);

次に、トリガーを作成しました

CREATE TRIGGER dbo.TXLogs ON dbo.Table
AFTER DELETE
AS
BEGIN
   DECLARE @Id varchar(30)
   DECLARE @Field1 varchar(30)
   DECLARE @Field2 varchar(30)
   DECLARE @Field4 varchar(30)

   SELECT Id,Field1,Field2 INTO #DeletedTempTable FROM deleted

   WHILE(EXISTS(SELECT Id,Field1,Field2 FROM #DeletedTempTable))
   BEGIN
      SET @Field4 = 'Delete Row'
      SELECT TOP 1 @Id =Id , @Field1 = Field1, @Field2 = Field2 FROM #DeletedTempTable

      INSERT INTO dbo.XLogs VALUES (@Id,@Field1,@Field2,@Field4,'0')

      DELETE FROM #DeletedTempTable WHERE Id = @Id
   END
END

最初の結果を格納する一時テーブルを作成し、while ループを使用してそれらをループします。

TOP 1 を選択して 1 行のみをリストし、データを読み取ってログ テーブルに保存した後、ループ行を削除し、再度ループして次の行を取得しました。更新された行に同じロジックを使用できますが、削除された FROM を挿入された FROM や他の行などに変更するだけです。

于 2020-09-22T17:42:51.473 に答える