Как организовать проверку вставляемых значений в триггере Instead of Insert в MS SQL

Помогите с таким вопросом: нужно организовать проверку вставляемых значений на совпадения в триггере для вьюшки по ключевом полю и если есть уже такое значение, то завершение работы триггера. Есть таблица с уже имеющимися в ней значениями:

CREATE TABLE Book (
 IDBook INT NOT NULL PRIMARY KEY,
 Name NVARCHAR(50) NOT NULL,
 Amount INT NOT NULL,
 Price INT NOT NULL,
);

Есть представление:

create view Vbook
as
    select IDBook, Name, Amount, Price from Book
go

Есть триггер:

CREATE TRIGGER myTrigger ON Vbook
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO Book(IDBook, Name, Amount, Price) 
    SELECT IDBook, Name, Amount, Price
    FROM inserted
END
go

Как организовать проверку вставляемых значений на совпадения в триггере для вьюшки по ключевом полю и если есть уже такое значение, то завершение работы триггера? К примеру, если в ключевом поле есть значение 5 и в insert into Vbook опять добавляется значение 5, то добавление не происходит и триггер заканчивает работу


Ответы (1 шт):

Автор решения: teran

Как вам уже написали в комментариях, чтобы исключить уже присутствующие записи из вставки можно пойти двумя путями:

a) Джойн к существующей таблице. у тех записей, которых нет, соответствия не будет, их и оставляем.

 INSERT ....
 SELECT ...
 FROM inserted
 LEFT JOIN book AS b ON (b.id = inserted.id) 
 WHERE b.id IS NULL

б) коррелирующий подзапрос для фильтрации вставляемых записей

INSERT ...
SELECT ....
FROM inserted
WHERE NOT EXISTS (
    SELECT * 
    FROM book AS b 
    WHERE b.id = inserted.id
)

можно еще написать where inserted.id not in (select id from book) но не стоит.

вариант "б", наверное, будет наиболее эффективен

→ Ссылка