1

我有一个表格适配器,里面装满了一个简单的:SELECT * FROM [view]

我尝试更新表适配器或添加新行,但没有任何反应。我有很多表适配器,但都被一张表填满,所以更新不是问题。但是现在使用视图来获取数据我无法进行更新/插入。

任何想法?

4

1 回答 1

1

如果视图是在多个表上创建的或具有聚合函数或具有 order by 子句或 union 子句,则意味着该视图是不可更新的视图。它不支持在此视图上插入/删除/更新。

您在视图中的两个表之间有连接,因此它不是可更新的视图。仅当仅在单个表上创建视图时才可更新视图。

只要满足以下条件,就可以通过视图修改基础基表的数据:

任何修改,包括 UPDATE、INSERT 和 DELETE 语句,都必须仅引用一个基表中的列。视图中被修改的列必须直接引用表列中的基础数据。这些列不能以任何其他方式派生,例如通过以下方式:

  • 聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。
  • 一个计算。无法从使用其他列的表达式计算该列。使用集合运算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列相当于计算并且也不可更新。

正在修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影响。TOP 不与 WITH CHECK OPTION 子句一起在视图的 select_statement 中的任何地方使用。

前面的限制适用于视图的 FROM 子句中的任何子查询,就像它们适用于视图本身一样。通常,数据库引擎必须能够明确地跟踪从视图定义到一个基表的修改。有关详细信息,请参阅通过视图修改数据。

如果之前的限制阻止您直接通过视图修改数据,请考虑以下选项:

代替触发器

可以在视图上创建 INSTEAD OF 触发器以使视图可更新。执行 INSTEAD OF 触发器而不是定义触发器的数据修改语句。此触发器允许用户指定处理数据修改语句必须发生的一组操作。因此,如果针对特定数据修改语句(INSERT、UPDATE 或 DELETE)的视图存在 INSTEAD OF 触发器,则可以通过该语句更新相应的视图。

分区视图

如果视图是分区视图,则该视图是可更新的,但受到某些限制。需要时,数据库引擎将本地分区视图区分为所有参与表和视图位于同一 SQL Server 实例上的视图,而分布式分区视图区分为视图中至少有一个表的视图驻留在不同的或远程服务器上。

有关详细信息,请参阅此 MSDN 链接

于 2012-05-10T10:09:36.337 回答