Триггер удаления SQL - PullRequest
       15

Триггер удаления SQL

0 голосов
/ 28 ноября 2018

У меня есть 3 таблицы:

POS (IDPOS, IDCARD);

КАРТЫ (IDCARD, IDPERSON);

ЧЕЛОВЕК (IDPERSON, PERSONTYPE).

Каждый раз, когда карта связана с POS, я должен убедиться, что лицо, имеющее эту карту, может быть только PERSONTYPE = 'Employee' или PERSONTYPE = 'Volunteer'.Это то, что я выполнил до сих пор, но, кажется, он не работает, когда я вставляю действительные записи.

DELETE POS
FROM inserted i 
INNER JOIN POS p ON i.IDPOS=p.IDPOS
INNER JOIN CARDS ON i.IDCARD=CARDS.IDCARD
INNER JOIN PERSON ON CARDS.IDPERSON=PERSON.IDPERSON
WHERE PERSONTYPE <> 'Employee' or PERSONTYPE <> 'Volunteer';

Этот триггер выполняется для таблицы POS и является после вставки, обновления.

Кто-нибудь знает, была ли это ошибка?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я полагаю, что вы использовали псевдоним для POS, вам нужно указать псевдоним для удаления.Также вы можете использовать NOT EXISTS() вместо соединения с другой таблицей:

с использованием псевдонима:

DELETE P
FROM POS AS P 
INNER JOIN INSERTED AS I ON i.IDPOS=p.IDPOS
INNER JOIN CARDS ON I.IDCARD=CARDS.IDCARD
WHERE NOT EXISTS (SELECT 1 
                    FROM PERSON 
                    WHERE CARDS.IDPERSON=PERSON.IDPERSON 
                    AND PERSONTYPE IN ('Employee','Volunteer')
                 );

обычное использование:

DELETE 
FROM POS
INNER JOIN INSERTED AS I ON I.IDPOS=POS.IDPOS
INNER JOIN CARDS ON I.IDCARD=CARDS.IDCARD
WHERE  NOT EXISTS (SELECT 1 
                    FROM PERSON 
                    WHERE CARDS.IDPERSON=PERSON.IDPERSON 
                    AND PERSONTYPE IN ('Employee','Volunteer')
                 );
0 голосов
/ 28 ноября 2018

Использование NOT IN:

WHERE PERSONTYPE NOT IN ('Employee', 'Volunteer');

Ваша логика требует AND, а не OR.

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