Обновление таблицы в триггере удаления для удаленных нескольких строк - PullRequest
3 голосов
/ 10 января 2012

Я начал со следующего триггера в SqlServer 2000

 ALTER TRIGGER DeleteTrigger
 ON [dbo].[WarrantyClaimsLineItems]
 FOR DELETE
 AS 
 begin

    declare @wa int
    SET @wa = (SELECT warrantyAuthNo from DELETED)
    update dbo.warrantyclaimsauth
    set isused = 0
    WHERE warrantyClaimsAuth.warrantyauthno = @wa


end

По сути, всякий раз, когда позиция удаляется из таблицы, мне нужно обновить warrantyauth.isUsed, который был назначен этому элементу, обратно на false.

работает при удалении одной позиции, но при удалении нескольких позиций появляется следующая ошибка.

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Я понимаю, почему триггер ожидает удаления только одной записи,поэтому мне нужно изменить его для обработки нескольких удалений строк.

Я провел некоторое исследование и изменил свой триггер, чтобы он был таким

....
 AFTER DELETE
 AS 
 begin

    update dbo.warrantyclaimsauth set isUsed = 0
    from dbo.warrantyclaimsauth a
    inner join deleted d on a.warrantyAuthNo = a.warrantyAuthNo


 end

, однако при этом каждая строка в гарантийном требовании обновляется с 0 вПоле isUsed.Может кто-нибудь помочь мне с тем, что я делаю не так?Спасибо!

Ответы [ 3 ]

4 голосов
/ 10 января 2012

Ваше условие соединения неверно во втором. Попробуйте это:

 AFTER DELETE
 AS 
 begin

    update a set isUsed = 0
    from dbo.warrantyclaimsauth a
    inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo


 end

Вы присоединились к deleted, где warrantyauthno соответствует самому себе, а не значению из таблицы deleted. По сути, вы просто делали cross join из deleted и не фильтровали строки, как раньше.

3 голосов
/ 10 января 2012
....
 AFTER DELETE
 AS 
 begin

    update dbo.warrantyclaimsauth set isUsed = 0
    from dbo.warrantyclaimsauth a
    inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo


 end
3 голосов
/ 10 января 2012
inner join deleted d on a.warrantyAuthNo = a.warrantyAuthNo

должно быть

inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo

В настоящее время у вас есть тривиальное условие соединения, дающее перекрестное соединение, которое не фильтруется до deleted

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...