为什么我们可以在sql server中编辑视图

时间:2013-07-18 10:38:14

标签: sql-server oracle

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

5 个答案:

答案 0 :(得分:4)

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

举一个简单的例子,你可以有一张人员表。您可以创建一个视图,允许某些用户更新紧急联系人详细信息等字段,但不能查看或更新银行详细信息或工资

要使视图可更新,需要满足许多条件,并且您确实可以使用INSTEAD OF触发器来扩展功能http://msdn.microsoft.com/en-us/library/ms187956.aspx

答案 1 :(得分:2)

  

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

不,它更像是一个虚拟表 - 只要你有一个真正的表,你应该能够用一个视图替换它,并且用户应该更聪明。

根据Codd

  

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

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

答案 2 :(得分:2)

除了@JamieA所写的内容之外,视图不仅可以限制对字段的访问,还可以限制对表中数据的访问。

看一下简单的SQL-Fiddle example并进行实验
示例中的视图仅限制对表的列id,val1的访问,还限制对行的restrics访问(仅id = 2..10)。您只能在视图中更新和删除行2..10。
但是,视图不会阻止插入id = 20的行 这是another example - 带有检查选项的视图 - 在这种情况下,视图不仅可以防止删除和更新,还可以防止插入与视图的where子句不匹配的行。登记/>
@yogi写道,如果视图连接两个表,我们无法更新视图 - >这是一个third demo,它显示了一个连接两个表的简单视图,以及该视图的更新如何工作。

这些简单的示例适用于Oracle,但经过小的修改也应该在MS-SQL中工作(必须更改create table中的数据类型),因为当我看起来通过MSDN文档(部分:可更新视图 - > http://msdn.microsoft.com/en-us/library/ms187956.aspx)时,我没有发现ms-sql和oracle之间有任何显着差异,似乎两个数据库上的视图工作方式类似。

答案 3 :(得分:0)

是的,有可能在Oracle中,其他答案已经解释了为什么视图可以更新并且已经对这个问题有所了解,它们在Oracle中也是允许的,但是这里有一些限制/限制是Oracle documentation

就像,视图选择不能具有:聚合函数,distinct子句,group by ...阅读链接以获取更多信息

答案 4 :(得分:-2)

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

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

根据具有以下限制的Pinal Dev观点

  • ORDER BY不起作用。
  • 通过加入表外视图来添加列是昂贵的
  • 在不经常使用的视图上创建的索引
  • SELECT *并在视图中添加列问题
  • COUNT(*)不允许,但COUNT_BIG(*)允许
  • UNION不允许但在索引视图中允许或
  • 索引视图中不允许跨数据库查询
  • 索引视图中不允许外部加入
  • 索引视图中不允许自选加入
  • 关键字视图定义不得包含索引视图
  • 使用索引视图查看不可能的视图