1

トリガー(追加と削除)に問題があります:

ALTER TRIGGER [trgAfterShoppingInserted]
ON [ShopingList] AFTER INSERT 
AS BEGIN
   DECLARE @cardId char(6), @points int, @userId int

   SET @cardId = (SELECT cardId FROM inserted)
   SET @points = (SELECT points FROM inserted)
   SET @userId = (SELECT userId from [Card] WHERE id = @cardId)
   IF @userId = 0
   BEGIN
   Update [Card]
   set points = points + @points
   where id =@cardId
   END
   ELSE
   Update [Card]
   set points = points + @points
   where id =@cardId OR
   userId = @userId
END


ALTER TRIGGER [trgAfterShoppingDeleted]
ON [ShopingList] AFTER DELETE 
AS BEGIN
   DECLARE @cardId char(6), @points int, @userId int

   SET @cardId = (SELECT cardId FROM inserted)
   SET @points = (SELECT points FROM inserted)
   SET @userId = (SELECT userId from [Card] WHERE id = @cardId)
   IF @userId = 0
   BEGIN
   Update [Card]
   set points = points - @points
   where id =@cardId
   END
   ELSE
   Update [Card]
   set points = points - @points
   where id =@cardId OR
   userId = @userId
END

問題はにありますSET @cardId..

エラーは次のとおりです。

サブクエリは複数の値を返しました。サブクエリが=、!=、<、<=、>、> =の後に続く場合、またはサブクエリが式として使用される場合、これは許可されません。

どのようにそれは可能ですか?

助けてくれてありがとう

4

2 に答える 2

2

挿入または削除ステートメントで複数の行を挿入または削除する必要がある場合は、両方のトリガーは機能しません。トリガーが単一の行のみを処理すると仮定するのをやめる必要がありますが、そうではありません。一度に複数の行を処理するようにトリガーを書き直す必要があります(InsertedおよびDeletedテーブル内)

trgAfterShoppingDeleted例として、次のように書き直すことができます。

ALTER TRIGGER [trgAfterShoppingDeleted]
ON [ShopingList] AFTER DELETE 
AS BEGIN
   UPDATE [Card]
   SET points = points - i.points
   FROM Inserted i
   WHERE Card.id = i.id AND i.UserId = 0

   UPDATE [Card]
   SET points = points - @points
   FROM Inserted i
   WHERE i.UserId <> 0 AND (Card.id = i.id OR Card.userId = i.userId)
END

データのセットを検討する必要があります。トリガーの疑似テーブルで単一の行を想定したり、トリガーでRBAR(row-by-agonizing-row)処理を実行したりしないでください。

于 2012-09-28T15:11:59.010 に答える
1

deletedテーブルには、特定のDELETEステートメントの一部として削除されたレコードが含まれ、DELETE基準が複数のレコードに一致した場合は複数の行を含めることができます。

これがあなたのケースで起こったことであり、複数のレコードを含むテーブルから選択しようとするとcardIddeletedselectステートメントが複数の値を返すため、トリガーがその例外をスローします。

于 2012-09-28T14:52:47.390 に答える