Мы выполняем перенос базы данных на SQL Server, и для поддержки устаревшего приложения мы определили представления в таблице SQL Server, которые представляют данные в соответствии с ожиданиями устаревшего приложения.
Однако теперь у нас возникли проблемы с триггерами INSTEAD OF INSERT, определенными для этих представлений, когда поля могут иметь значения по умолчанию.
Я попробую привести пример.
Таблица в базе данных имеет 3 поля: a, b и c. c является совершенно новым, устаревшее приложение не знает об этом, поэтому у нас также есть представление с двумя полями, 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 было указано значение, оно использовалось в триггере, а если нет, то вместо этого использовалось значение по умолчанию.
РЕДАКТИРОВАТЬ: добавлено, что я бы не хотел дублировать значения по умолчанию в триггере. Значения по умолчанию уже находятся в схеме базы данных, я надеюсь, что смогу просто использовать их напрямую.