2

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

4

5 回答 5

5

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

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

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

于 2013-07-18T10:56:51.193 回答
3

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

不,它更像是一个虚拟表——只要你有一个真实的表,你应该能够用视图来替换它,而且用户也不应该更聪明。

根据科德

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

然而,在实践中,这个理想并没有实现。

于 2013-07-18T10:59:53.767 回答
2

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

查看简单的 SQL-Fiddle 示例并进行试验。

示例中的视图仅限制对表的列 id,val1 的访问,但也限制对行的访问(仅 id = 2..10)。您只能通过视图更新和删除第 2..10 行。
但是视图不会阻止插入 id = 20 的行

这是另一个示例-带有检查选项的视图- 在这种情况下,视图不仅阻止删除和更新,而且阻止插入与 where 子句不匹配的行风景。

@yogi 写道,如果视图连接两个表,我们将无法更新视图 -> 这是第三个演示,它显示了一个连接两个表的简单视图,以及该视图的更新如何工作。

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

于 2013-07-18T13:45:40.593 回答
0

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

就像,视图选择不能有:聚合函数,不同的子句,分组...阅读链接了解更多信息

于 2013-07-18T15:38:37.377 回答
-2

由于视图是read only tables并且doesn't support DML statements您无法对视图执行更新。

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

根据Pinal Dev Views 有以下限制

  • ORDER BY 不起作用。
  • 通过在视图外连接表来添加列是昂贵的
  • 在不经常使用的视图上创建的索引
  • SELECT * 并在视图中添加列问题
  • COUNT(*) 不允许但 COUNT_BIG(*) 允许
  • 索引视图中不允许但 OR 允许的 UNION
  • 索引视图中不允许跨数据库查询
  • 索引视图中不允许外部联接
  • 索引视图中不允许 SELF JOIN
  • 关键字视图定义不得包含索引视图
  • 使用索引视图无法查看视图
于 2013-07-18T10:48:02.753 回答