TSQL期望在使用而不是插入触发器时插入标识列

时间:2013-07-08 16:01:52

标签: sql sql-server tsql triggers

我正在设置一个视图(foo),而不是一个具有相同名称的表。新视图将使用3个子表(A,B,C)而不是原始表。我正在使用替代触发器来实现这一目标。

CREATE VIEW [dbo].[foo]
AS
select
    b2 as oldkey,
    b3 as boat,
    c2 as state,
    a2 as name
from
    A
    join B on a1 = b1
    join C on a1 = c1

foo columns :oldkey(identity)|船|州|名称

我的问题是我有一个很大的代码库,编写插入到foo中,如下所示:

insert into foo
values
('fishing boat', 'California', 'Skipper')

但是此代码当前不起作用,因为而不是插入/视图也期望提供键值。键值是表B上的标识,因此我不需要插入它。

错误:“列名或提供的值与表定义不匹配。”

我需要做些哪些更改才能使已存在的插入代码库继续运行?

1 个答案:

答案 0 :(得分:2)

由于INSERT 指定了预期的列,但使用了隐式的标识列跳过技巧,我认为你只是运气不好。

这是为什么指定列名是最佳做法的一个很好的例子。如果原始代码指定了列名,如下所示:

INSERT INTO dbo.Foo (ItemType, Location, Name)
VALUES ('fishing boat', 'California', 'Skipper');

然后插入将起作用(具有以下修改)。

如果在INSERT中为视图指定了 列,则可以通过修改视图跳过identity列,以使列不再保留{{1视图元数据中的属性或PK状态。你可以这样做:

identity