我们正在执行向 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 提供了一个值,它将在触发器中使用,但如果不是,则使用默认值。
编辑:补充说我宁愿不复制触发器中的默认值。默认值已经在数据库模式中,我希望我可以直接使用它们。