Мы выполняем миграцию базы данных на SQL Server, и для поддержки устаревшего приложения мы определили представления таблицы SQL Server, которые представляют данные в соответствии с ожиданиями устаревшего приложения.
Однако теперь у нас возникают проблемы с триггерами INSTEAD OF INSERT, определенными для этих представлений, когда поля могут иметь значения по умолчанию.
Я попробую привести пример.
Таблица в базе данных имеет 3 поля, a, b и c. c является совершенно новым, устаревшее приложение не знает об этом, поэтому у нас также есть представление с 2 полями, a и b.
Когда устаревшее приложение пытается вставить значение в его представление, мы используем триггер INSTEAD OF INSERT для поиска значения, которое должно идти в поле c, что-то вроде этого:
INSERT INTO realTable(a, b, c) SELECT Inserted.a, Inserted.b, Calculated.C FROM...
(Подробности поиска не имеют значения.)
Этот триггер работает хорошо, если поле b не имеет значения по умолчанию. Это потому, что если запрос
INSERT INTO legacyView(a) VALUES (123)
выполняется, затем в триггере Inserted.b имеет значение NULL, а не значение по умолчанию для b. Теперь у меня есть проблема, потому что я не могу отличить вышеуказанный запрос, который поместил бы значение по умолчанию в b, и это:
INSERT INTO legacyView(a,b) VALUES (123, NULL)
Даже если b было не NULLABLE, я не знаю, как написать запрос INSERT в триггере так, чтобы, если значение было предоставлено для b, оно использовалось в триггере, но вместо этого использовалось значение по умолчанию.
EDIT: добавлено, что я бы не стал дублировать значения по умолчанию в триггере. Значения по умолчанию уже есть в схеме базы данных, я надеюсь, что смогу использовать их напрямую.