在sql server中我们可以更新数据视图。我认为视图的概念是只读表。为什么我们可以在sql中编辑视图。oracle中有可能吗?
5 回答
为了回答您为什么我们可以创建可编辑视图的问题,您可以限制对您不想更新(或查看)的字段的访问。然后您可以授予用户对视图的访问权限,但不能授予对基础表的访问权限
举个简单的例子,你可以有一张人事表。您可以创建一个视图,允许某些用户更新紧急联系人详细信息等字段,但不能查看或更新银行详细信息或工资
要使视图可更新,需要满足许多标准,您确实可以使用 INSTEAD OF 触发器来扩展功能http://msdn.microsoft.com/en-us/library/ms187956.aspx
我认为视图的概念是只读表
不,它更像是一个虚拟表——只要你有一个真实的表,你应该能够用视图来替换它,而且用户也不应该更聪明。
根据科德:
规则6:视图更新规则:所有理论上可更新的视图必须是系统可更新的。
然而,在实践中,这个理想并没有实现。
除了@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 之间有任何显着差异,似乎视图在两个数据库上的工作方式相似。
是的,在 Oracle 中是可能的,其他答案已经解释了为什么视图是可更新的,并阐明了这个问题,它们在 Oracle 中也是允许的,但这里有一些限制/限制是Oracle 文档
就像,视图选择不能有:聚合函数,不同的子句,分组...阅读链接了解更多信息
由于视图是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
- 关键字视图定义不得包含索引视图
- 使用索引视图无法查看视图