2013-07-18 41 views
1

在sql server中我们可以更新数据视图。我认为视图的概念是只读表。 为什么我们可以在oracle中编辑sql.is中的视图呢?为什么我们可以在sql server中编辑视图

+1

正是你的意思与“更新视图”是什么?针对视图运行'UPDATE'语句?是的,Oracle也可以(以及其他许多现代DBMS) –

+0

更新数据。为什么我们可以更新视图? –

+0

你不需要在View上使用“而不是”触发器来执行更新逻辑吗? – DaveShaw

回答

5

要回答你的,为什么我们可以创建一个可编辑视图的问题,它这样您可以限制您不想更新(或查看)的字段的访问权限。然后,您可以授予用户访问视图的权限,但不允许访问基础表

对于一个简单的示例,您可以拥有一个人员表。您可以创建允许一些用户更新如紧急联系方式,现场的观点,但看不到或更新的银行信息或工资

有很多的标准,以满足做一个视图可更新,你的确可以INSTEAD OF使用触发器扩展功能http://msdn.microsoft.com/en-us/library/ms187956.aspx

-1

由于意见为read only tables及其doesn't support DML statements您无法在视图上执行更新。

一个有趣的因素是,你可以写update statemnt over view并编写一个instead of trigger,因此你可以在视图中的表上执行multiple update statements

根据具有以下限制

  • ORDER BY不起作用Pinal Dev意见。
  • 加列贵通过加入表外观
  • 创建索引上查看不经常使用
  • SELECT *和添加列问题在查看
  • COUNT(*)不允许,但COUNT_BIG(*)允许
  • UNION不允许,但或索引视图允许
  • 跨数据库查询在索引视图中不允许
  • 外索引视图加入不允许
  • SELF JOI N的索引视图中不允许
  • 关键词视图定义一定不包含索引视图
  • 查看在查看不可能索引视图
+2

这是关于索引视图。另外,Pinal Dave并不是网络上的最佳来源。他只是从官方文件中反馈信息。 – usr

+0

在许多情况下,视图不是“只读表”(如果视图符合一些基本条件 - 即使在连接两个或多个表时),也可以在视图下修改表而不用触发器,详情请参阅文档, “可更新视图”:http://msdn.microsoft.com/en-us/library/ms187956.aspx – krokodilko

3

我想视图的概念是一个只读表

不,这更像是一个虚拟表的 - 任何地方,你有一个真正的表,你应该是能够用视图取代它,一个d用户应该没有智慧。

根据Codd

规则6:视图更新规则: 在理论上可更新所有视图必须是由该系统可更新的。

然而,实际上,这种理想是不可实现的。

2

除了什么@JamieA写道,观点不仅能限制进入领域,也限制访问表中的数据。

看看简单SQL-Fiddle example和试验它。

该示例中的视图限制访问仅列ID,表中的VAL1,也restrics访问行(仅ID = 2..10)。您只能更新和删除视图中的第2..10行。
不过视图不阻止ID为行插入= 20

这里是another example - 一个观点与检查选项 - 这这种情况下,鉴于防止不仅删除和更新,但阻止也将行是做不匹配视图的where子句。

@yogi写道,如果视图连接两个表时,我们不能更新视图 - >这里是一个third demo显示联接两个表的简单看法,以及如何查看作品的更新。这些简单的例子适用于Oracle,但经过小的修改后,也应该在MS-SQL中工作(必须更改创建表中的数据类型),因为当我查看通过MSDN文档时(部分:可更新视图 - >http://msdn.microsoft.com/en-us/library/ms187956.aspx),我没有' t找到ms-sql和oracle之间的任何显着差异,似乎视图在两个数据库上都是相似的。

0

是的,它是Oracle可能的,其他的答案已经解释了为什么意见是可更新的,并阐明了这个问题的一些光,但也允许在Oracle中,但有一些限制/这里限制的是Oracle documentation

像,在视图中选择不能有:聚合函数,不同的条款,按...阅读链接了解更多信息

相关问题