我问这个问题的方式是试图了解我遇到的类似情况,并试图了解插入查看是如何工作的。
我有这些表:
Create table A([id] int primary key not null, value nvarchar(50) NULL)
Create table B([id] int primary key not null, value nvarchar(50) NULL)
我从两个表中创建视图,如下所示:
create View V as (select * from A) UNION ALL (select * from B)
我在 V 视图上有这个触发器:
Create trigger v_trig on V instead of insert AS
insert into v (id,value) select id,value from inserted
当我尝试插入我的视图时,我收到以下错误:
消息 4436,级别 16,状态 12,过程 v_trig,第 2 行
UNION ALL 视图“db.dbo.V”不可更新,因为未找到分区列
我有一个具有相似视图(带有union all
)的数据库,出于某种原因,我可以毫无问题地插入其中,我试图了解原因。
我应该怎么做才能允许插入到诸如视图中?有没有办法决定(不更改触发器)哪个是视图的默认表以插入其中?
您只能在插入分区视图时执行此操作(触发器无关紧要),分区视图是可以查看基础表具有与 a不相交的适当约束
UNION ALL
的数据的视图,因此 an会毫无疑问地进入一个基础表。CHECK
primary key
INSERT
按照您的示例,如果您限制 table 的某些值,限制 table
A
的其他值B
并添加复合主键:视图保持不变:
现在您可以成功地直接插入到视图中(不需要触发器):
插入与for 表(分区列)
value = 'B'
匹配,因此该行会自动进行。由于检查的列必须是主键的一部分,SQL 引擎知道这一行属于该表而不属于任何其他表,因为它们都有具有相同列和不同检查值的主键。您无法手动控制它。CHECK
B
如果您尝试插入任何
CHECK
约束都不支持的值...检查插入视图的表的 DDL,您将看到不相交的
CHECK
约束。