【发布时间】:2014-11-18 09:28:07
【问题描述】:
我们在视图上有一个“Instead-Of-Insert”触发器,它将所有值从 INSERTED 虚拟表复制到另一个表。
列表中的一个字段对于目标表是不可为空的,并且指定了默认值。
我们遇到的是,一些应用程序代码正在发送一个插入命令,并且没有指定不可为空的字段 - 这(如果插入是针对实际表执行的)通常会导致 SQL Server 插入列的默认值价值。但是,触发器对所有字段都是显式的,因此触发器会尝试为该字段插入 null ......导致错误。
我不想要的是这样的代码......
INSERT INTO XXXX (col1, col2, col3)
SELECT
ISNULL(col1, 0), ISNULL(COL2, 0), ISNULL(COL3, 0)
FROM INSERTED
我不希望触发器需要知道每列的实际默认值应该是什么(从可维护性的角度来看)...
谁有更好的解决方案?
谢谢
【问题讨论】:
-
您是否考虑过在基础表中使用默认值?
-
这就是问题所在——我们确实有基础表的默认值。因此,当视图为该列发送 NULL 时,表上的默认值是什么并不重要,数据库不会允许 null,并且不会使用默认值,因为 View 触发器查询指定了显式 null
-
我能想到的避免硬编码实际默认值的唯一方法是有一个丑陋的查询,从
sys.default_constraints中提取定义 - 你需要反复加入这个表,对于您想要获取其默认值的每一列,您必须依赖用于默认值的实际值很容易转换为所需的实际数据类型。该解决方案的复杂性和脆弱性使得在触发器中嵌入列默认值(对我而言)是更好的选择。 -
@Damien_The_Unbeliever 同意了。
标签: sql sql-server triggers