视图如何充当实际表和最终用户之间的中介?创建视图时发生的内部过程是什么。我的意思是,当在表上创建视图时,它是否像表和最终用户之间的墙一样站立?视图如何保护实际表,仅使用检查选项?但是如果用户直接插入表中,那么我如何保护实际的表?
如果他/她不使用 : insert into **vw** values()
,而是使用: insert into **table_name** values()
,那么现在如何保护表?
视图如何充当实际表和最终用户之间的中介?创建视图时发生的内部过程是什么。我的意思是,当在表上创建视图时,它是否像表和最终用户之间的墙一样站立?视图如何保护实际表,仅使用检查选项?但是如果用户直接插入表中,那么我如何保护实际的表?
如果他/她不使用 : insert into **vw** values()
,而是使用: insert into **table_name** values()
,那么现在如何保护表?
非物化视图只是预先打包的 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
取决于用于创建视图以强制执行一定程度的更新限制的查询,但这还不足以确保不会发生任何事情。这表明,防止不必要的添加/编辑/删除的唯一可靠方法是向用户授予适当的权限,最好是通过角色。
视图不保护表,尽管它们可以在基于权限的表保护方案中使用。视图只是提供了一种访问表的便捷方式。如果您授予用户访问视图而不是表的权限,那么您的访问权限可能会受到很大限制。