SQL Serverへのデータベースの移行を実行しており、レガシーアプリをサポートするために、レガシーアプリが期待するとおりにデータを表示するビューをSQLServerテーブルに定義しました。
ただし、フィールドにデフォルト値がある場合、これらのビューで定義されたINSTEADOFINSERTトリガーで問題が発生しています。
例を挙げてみましょう。
データベース内のテーブルには、a、b、およびcの3つのフィールドがあります。cはまったく新しいものであり、レガシーアプリはそれを認識しないため、aとbの2つのフィールドを持つビューもあります。
レガシーアプリがビューに値を挿入しようとすると、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がNULL以外の場合でも、トリガーにINSERTクエリを記述して、bに値が指定されている場合はその値がトリガーで使用されるようにする方法がわかりませんが、そうでない場合はデフォルトが代わりに使用されます。
編集:トリガーのデフォルト値を複製したくないと付け加えました。デフォルト値はすでにデータベーススキーマにあります。直接使用できるといいのですが。