0

视图如何充当实际表和最终用户之间的中介?创建视图时发生的内部过程是什么。我的意思是,当在表上创建视图时,它是否像表和最终用户之间的墙一样站立?视图如何保护实际表,仅使用检查选项?但是如果用户直接插入表中,那么我如何保护实际的表?

如果他/她不使用 : insert into **vw** values(),而是使用: insert into **table_name** values(),那么现在如何保护表?

4

2 回答 2

4

非物化视图只是预先打包的 SQL 查询。它们的执行方式与任何派生表/内联视图相同。对同一视图的多个引用将运行该视图包含的每个引用的查询。IE:

CREATE VIEW vw_example AS
  SELECT id, column, date_column FROM ITEMS

SELECT x.*, y.*
  FROM vw_example x
  JOIN vw_example y ON y.id = x.id

...转化为:

SELECT x.*, y.*
  FROM (SELECT id, column, date_column FROM ITEMS) x
  JOIN (SELECT id, column, date_column FROM ITEMS) y ON y.id = x.id

缓存

主要好处是缓存,因为查询将是相同的。查询被缓存,包括执行计划,以便以后查询运行得更快,因为执行计划已经生成。缓存通常要求查询与区分大小写的点相同,并且最终会过期。

谓词推送

另一个潜在的好处是视图通常允许“谓词推送”,其中视图上指定的标准可以推送到优化器表示的视图中的查询中。这意味着查询可以扫描表一次,而不是扫描表以便将结果集呈现给外部/最终查询。

SELECT x.*
  FROM vw_example x
 WHERE x.column = 'y'

...可以被优化器解释为:

SELECT id, column, date_column 
  FROM ITEMS
 WHERE x.column = 'y'

谓词推送的决定完全取决于优化器。我不知道开发人员有任何强制决定的能力,只是它实际上取决于视图使用的查询以及正在应用的附加条件。

非物化视图的典型使用评论

遗憾的是,经常看到非物化 SQL 视图仅用于封装以简化编写查询——简化也不是推荐的做法。SQL 是基于 SET 的,使用过程方法不能很好地优化。将视图相互叠加也不是推荐的做法。

可更新视图

非物化视图也是可更新的,但存在一些限制,因为视图可以由连接在一起的多个表组成。可更新的非物化视图将阻止用户插入新记录,但可以更新现有记录。 CHECK OPTION取决于用于创建视图以强制执行一定程度的更新限制的查询,但这还不足以确保不会发生任何事情。这表明,防止不必要的添加/编辑/删除的唯一可靠方法是向用户授予适当的权限,最好是通过角色。

于 2011-03-10T05:54:06.807 回答
2

视图不保护表,尽管它们可以在基于权限的表保护方案中使用。视图只是提供了一种访问表的便捷方式。如果您授予用户访问视图而不是表的权限,那么您的访问权限可能会受到很大限制。

于 2011-03-10T05:39:41.540 回答