【发布时间】:2011-01-13 03:08:56
【问题描述】:
我们正在执行向 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 提供了一个值,它将在触发器中使用,但如果不是,则使用默认值。
编辑:补充说我不想在触发器中复制默认值。默认值已经在数据库模式中,我希望我可以直接使用它们。
【问题讨论】:
-
知道所有具有默认值的字段都不能为空,这非常重要!如果我知道这些信息,我本可以为您提供解决方案。
-
对不起 Emtucifor,我当时不知道我发布了我们在可空字段上没有任何默认值的问题。你的解决方案是什么?如果它很好,我仍然可以投票,也许会改变接受的答案!
标签: sql sql-server triggers legacy default-value