我正在设置一个视图(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上的标识,因此我不需要插入它。
错误:“列名或提供的值与表定义不匹配。”
我需要做些哪些更改才能使已存在的插入代码库继续运行?
答案 0 :(得分:2)
由于INSERT
不指定了预期的列,但使用了隐式的标识列跳过技巧,我认为你只是运气不好。
这是为什么指定列名是最佳做法的一个很好的例子。如果原始代码指定了列名,如下所示:
INSERT INTO dbo.Foo (ItemType, Location, Name)
VALUES ('fishing boat', 'California', 'Skipper');
然后插入将起作用(具有以下修改)。
如果在INSERT
中为视图指定了 列,则可以通过修改视图跳过identity
列,以使列不再保留{{1视图元数据中的属性或PK状态。你可以这样做:
identity