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

Sql server 为什么我们可以在sql server中编辑视图,sql-server,oracle,Sql Server,Oracle,在sql server中,我们可以更新数据视图。我认为视图的概念是一个只读表。 为什么我们可以在sql中编辑视图。oracle中有可能吗?因为视图是只读表,并且它的不支持DML语句,所以不能在视图上执行更新 一个有趣的因素是,您可以在视图上编写updatestatemennt,并为此编写而不是触发器,因此您可以对视图中的表执行多个update语句 根据有以下限制的观点 按命令不起作用 通过连接表外部视图来添加列的成本很高 在视图上创建的索引不经常使用 选择*并在视图中添加列问题 不允许计数(*

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

因为视图是
只读表
,并且它的
不支持DML语句
,所以不能在视图上执行更新

一个有趣的因素是,您可以在视图上编写
updatestatemennt
,并为此编写
而不是触发器
,因此您可以对视图中的表执行
多个update语句

根据有以下限制的观点

  • 按命令不起作用
  • 通过连接表外部视图来添加列的成本很高
  • 在视图上创建的索引不经常使用
  • 选择*并在视图中添加列问题
  • 不允许计数(*),但允许计数大(*)
  • 索引视图中不允许联合,但允许或
  • 索引视图中不允许跨数据库查询
  • 索引视图中不允许外部联接
  • 索引视图中不允许自联接
  • 关键字视图定义不能包含索引视图的关键字
  • 无法使用索引视图查看视图

要回答您的问题,为什么我们可以创建一个可编辑视图,这样您就可以限制对不希望更新(或查看)的字段的访问。然后,您可以让用户访问视图,但不能访问基础表

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

要使视图可更新,有很多条件需要满足,而且您确实可以使用替代触发器来扩展功能

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

不,它更像是一个虚拟表——无论你在哪里有一个真正的表,你都应该能够用一个视图来替换它,用户也不应该更聪明

根据:

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


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

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

看看simple并用它进行实验。

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

这是一个带有复选选项的视图。在这种情况下,视图不仅阻止删除和更新,而且还阻止插入与视图的where子句不匹配的行。

@yogi写道,如果视图连接两个表,我们就不能更新视图->下面是一个示例,它显示了连接两个表的简单视图,以及该视图的更新工作方式。


这些简单的例子是针对Oracle的,但是经过一些小的修改后,MS-SQL也可以使用(必须在创建表中更改数据类型),因为当我查看MSDN文档(部分:可更新视图->)时,我没有发现MS SQL和Oracle之间有任何显著的差异,视图在两个数据库上的工作方式似乎相似

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


与此类似,视图select不能有:聚合函数、distinct子句、group by。。。阅读链接了解更多信息

您对“更新视图”的确切含义是什么?对视图运行
UPDATE
语句?是的,在Oracle(以及许多其他现代DBMS)中也可以更新数据。为什么我们可以更新视图?您不需要视图上的“代替”触发器来执行更新逻辑吗?我认为我们可以更新视图的数据,直到它属于一个表为止,如果视图由使用joins@yogi,不完全是(,请参见可更新视图部分),但确实存在一些限制。这是关于索引视图的。此外,皮纳尔·戴夫不是网络上最好的信息来源。他只是从官方文档中重复信息。视图不是“只读表”,在许多情况下(如果视图满足一些基本条件,甚至在连接两个或多个表时),您可以在视图下修改表,而无需instead of触发器,有关详细信息,请参阅文档中的“可更新视图”部分: