然而,当字段可能具有默认值时,在那些视图上定义的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 字段是否有默认值,此触发器都能正常工作。问题在于如果查询语句中没有包含 b 字段,那么当 b 字段有默认值时,它将无法触发对应操作。
INSERT INTO legacyView(a) VALUES (123)
如果执行了以下语句,那么在触发器中,Inserted.b将为NULL,而不是b的默认值。现在我有一个问题,因为我无法区分上述查询会将默认值放入b和这个查询:
INSERT INTO legacyView(a,b) VALUES (123, NULL)
即使b是非NULL值,我也不知道如何在触发器中编写INSERT查询,以便如果为b提供了值,则在触发器中使用它,但如果没有提供,则使用默认值。
编辑:我不想在触发器中复制默认值。 默认值已经在数据库模式中,我希望能直接使用它们。