Ваш код здесь:
INSERT INTO users
VALUES('Chuck', 'Norris', 'abc')
попытается вставить abc
в столбец age
, который имеет тип int
- действительно ли это int ?? Я считаю, что даже если у вас есть триггер INSTEAD OF INSERT
, таблица Inserted
, которая находится внутри триггера, будет иметь ту же структуру, что и ваша таблица Users
- и этот столбец age
является столбцом INT
и может не имеет дело с abc
как значением!
В качестве общей рекомендации, я бы всегда явно указывал, какие столбцы вы имеете в виду во вставках - поэтому я бы написал вышеупомянутый запрос как:
INSERT INTO users(firstname, lastname, age)
VALUES('Chuck', 'Norris', 71)
и я бы изменил это:
INSERT INTO users
SELECT firstname, lastname, age
FROM inserted
WHERE ISNUMERIC(age) = 1;
на это:
INSERT INTO users(firstname, lastname, age)
SELECT firstname, lastname, age
FROM inserted
WHERE ISNUMERIC(age) = 1;
Таким образом, у вас не будет никаких неприятных сюрпризов, если какая-то таблица будет изменена и внезапно получит новый столбец, который ваш "универсальный" INSERT
не заполнит ...
В качестве примечания: я надеюсь, что вы понимаете это, указав следующее:
CREATE TABLE rejectedUsers
(
id int PRIMARY KEY IDENTITY,
firstname nvarchar,
lastname nvarchar,
age nvarchar
)
Вы фактически создаете таблицу с большим количеством nvarchar(1)
столбцов, которые могут содержать колоссальный максимум 1 символа каждый! Вы также должны всегда предоставлять явные длины для своих varchar
и nvarchar
столбцов .....