我有一个表适配器,它填充了一个简单的:SELECT * FROM [view]
我尝试更新表适配器或添加新行,但没有任何反应。我有很多表适配器,但都填充了一个表,所以更新不是问题。但现在使用视图获取数据我无法进行更新/插入。
有什么想法吗?
答案 0 :(得分:1)
如果在多个表上创建视图或具有聚合函数或具有order by子句或union子句,则表示视图不是可更新视图。它不支持在此视图上插入/删除/更新。
您已在视图中的两个表之间进行连接,因此它不是可更新视图。仅当视图仅在单个表上创建时,视图才是可更新的。
只要满足以下条件,您就可以通过视图修改基础基表的数据:
任何修改(包括UPDATE,INSERT和DELETE语句)都必须仅引用一个基表中的列。 要在视图中修改的列必须直接引用表列中的基础数据。无法以任何其他方式派生列,例如通过以下方式:
要修改的列不受GROUP BY,HAVING或DISTINCT子句的影响。 TOP不会在视图的select_statement中的任何位置与WITH CHECK OPTION子句一起使用。
以前的限制适用于视图的FROM子句中的任何子查询,就像它们适用于视图本身一样。通常,数据库引擎必须能够明确地将视图定义中的修改跟踪到一个基表。有关更多信息,请参阅通过视图修改数据。
如果先前的限制阻止您直接通过视图修改数据,请考虑以下选项:
INSTEAD OF触发器
可以在视图上创建INSTEAD OF触发器以使视图可更新。执行INSTEAD OF触发器而不是定义触发器的数据修改语句。此触发器允许用户指定处理数据修改语句时必须执行的操作集。因此,如果对特定数据修改语句(INSERT,UPDATE或DELETE)的视图存在INSTEAD OF触发器,则相应的视图可通过该语句更新。
分区视图
如果视图是分区视图,则视图是可更新的,受某些限制。在需要时,数据库引擎将本地分区视图区分为所有参与表和视图位于同一SQL Server实例上的视图,并将分布式分区视图区分为视图中至少一个表的视图驻留在不同的或远程服务器上。