SQL Server активировать активную карту - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть следующие таблицы:

  • Карточки (IDCard, IDPerson, Баланс, Актив)
  • Персоны (IDPerson)

Каждый раз, когдановая карта вставлена, мне нужно проверить, принадлежит ли эта карта человеку.Если это так, мне нужно изменить активное значение на ложное, и новая карта должна получить остаток предыдущей карты, и состояние должно быть истинным.

select count(c.IDPerson) 
from cards c, inserted i 
where c.IDPerson = i.IDPerson;

if @@ROWCOUNT > 0
begin
    print'this card already exists'

    select c.IDPerson, c.Balance, c.Active
    INTO #tmp
    FROM Cards c, inserted i
    where c.IDCard = i.IDCard

    update Cards
    set Active = 0
    from #tmp
    where #tmp.IDPerson = Cards.IDPerson;
end

Когда я вставляю новую запись в таблицу карт,старая карта становится ложной (0), однако новая карта также остается с активным, равным ложному.Это после вставки на карточный стол.

Может кто-нибудь сказать мне, как решить проблему?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

if не подходит.Помните, что триггер может обрабатывать несколько строк одновременно.

Явная join выполняет необходимую фильтрацию.Это немного сложно, но вы можете сделать это с двумя join s:

update c2
    set Active = (case when c2.IDCard = i.IDCard then 1 else 0 end)
    from Cards c 
         inserted i
         on c.IDCard = i.IDCard join
         Cards c2
         on c.IDPerson = c2.IDPerson;
0 голосов
/ 04 декабря 2018

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

Когда вы обновляете, где INSERTED.IDPERSON = CARD.IDPERSON - это включает вставленную вами запись;таким образом, все записи обновляются до Active = false.

Скорее, вы должны сделать

update Cards
set Active = 0
from #tmp
where #tmp.IDPerson = Cards.IDPerson
AND Cards.IDCARD != #tmp.IDCARD    --This is the new condition

Я создал копию того, что, как я полагаю, вы спрашиваете в этой ссылке DBFiddle

Пользователь marc_s также правильно сказал, что здесь вы должны использовать синтаксис JOIN.Вся ваша операция может быть завершена в одном гораздо более чистом виде

UPDATE c
SET c.Active = 0
FROM Cards c
INNER JOIN Inserted i
ON i.IDPERSON = c.IDPERSON
AND i.IDCARD != c.IDCARD
...