SQL Server而不是视图上的插入触发器导致无法插入Null

时间:2014-09-24 02:27:23

标签: sql sql-server triggers

我们在视图上有一个替代插入触发器,它将所有值从INSERTED虚拟表复制到另一个表。

列表中的一个字段对于目标表是不可为空的,并且具有指定的默认值。

我们遇到的是,一些应用程序代码正在发送一个insert命令,而没有指定不可为空的字段 - 如果插件是针对实际表执行的,通常会导致SQL Server插入列&# 39; s默认值。但是,触发器对所有字段都是显式的,因此触发器会尝试为该字段插入null ...导致错误。

我不想要的是这样的代码......

INSERT INTO XXXX (col1, col2, col3) 
   SELECT 
      ISNULL(col1, 0), ISNULL(COL2, 0), ISNULL(COL3, 0) 
   FROM INSERTED

我不希望触发器需要知道每列的实际默认值(从可维护性的角度来看)......

有没有人有更好的解决方案?

由于

2 个答案:

答案 0 :(得分:0)

当您的应用程序将NULL值发送到不可为空的列时,没有太多选项。特别是当你不想在isnull上使用输入验证时。

我们在这种情况下使用默认值。如果有可能你可以改变你的表:

ALTER TABLE xxxx ADD CONSTRAINT DF_col1 DEFAULT N'default' FOR col1;

答案 1 :(得分:0)

我可以想到一种丑陋而低效的方式。我们的想法是插入默认行,然后使用try / catch一次更新列,以忽略错误。

declare @Id int;
insert int XXX DEFAULT VALUES;
set @id = @@IDENTITY;

begin try
    update XXX set col1 = val1 where id = @id;
end try
begin catch
end catch;

begin try
    update XXX set col2 = val2 where id = @id;
end try
begin catch
end catch;

. . .

如果必须在100列上执行此操作,那么这可能是一个坏主意。如果您只有两到三列导致问题,那么这可能会解决您的问题。