Firebird数据库
Firebird数据库语言参考-视图
2016-06-24 14:12:53

 

一个视图是一个虚拟表,实际上是SELECT查询为任何复杂性检索数据的一个存储和命名 。数据可以从一个或多个表中检索,从其他视图,也可从可选择的存储过程。不同于关系数据库中的常规表,视图不是一个独立的数据集存储在数据库中。当视图被选择时,结果是动态创建作为一个数据集。

 

视图的元数据是对于存储过程和触发处理生成二进制代码是有效,就好像他们是实际的表存储持久数据。

 

创建视图CREATE VIEW

 

作用: 创建一个视图
用于: DSQL
语法:

 



 

 

表 5.16. CREATE VIEW  语句参数

 

 

CREATE VIEW语句创建一个新的视图,视图的标识符(名称)必须是唯一的在数据库的所有视图、表、存储过程的名称中。

 

当调用的视图时,新视图的名称可以跟着应返回到调用方的列名称的列表,列表中的名称不必与它们的基表中的列的名称相关。

 

如果视图列的列表被省略,则系统将从 SELECT 语句中使用列名称和/或别名。如果重复的名称或非别名表达式列使这个无法获得有效的列表,视图的创建失败并出现错误。

 

在视图的列表中列数必须精确的匹配以SELECT语句在视图定义中的列数的为基础的选择列表。



• 如果指定的列的完整列表,在SELECT 语句中指定的别名是没有任何意义的,因为列列表中的名称将重写它们.
• 列列表是可选项,如果所有 SELECT 中的列显式命名且在选择列表中是唯一的.

 

一个可以是可更新或只读的。如果视图是可更新的,数据检索时视图被调用能被 DML 语句插入、 更新、 删除、 更新或插入或合并更改。所做的更改在可更新的视图中应用于基表。

 

只读视图同触发器一些使用可以使它可更新。一旦触发器被定义在一个视图,更改通报到它永远不会自动写入底层表,即使是一开始就是可更新视图。这是程序员的责任,以确保触发器更新(或删除,或插入)根据需要插入基表。

 

一个视图如果满足下列所有条件将自动是可以更新的:

•SELECT语句查询仅一个表或一个可更新的视图

• SELECT语句没有调用任何存储过程

•每个基表(或基本视图)中符合下列条件之一列没有出现在视图定义中
- 它可以是NULL值
- 它有一个非NULL默认值
- 它有一个提供触发器允许的值

•SELECT 语句包含的字段没有来自子查询或其他表达式

• SELECT 语句不包含通过聚集函数定义的字段,例如:MIN, MAX, AVG,SUM, COUNT, LIST

• SELECT 语句不包含ORDER BY 或 GROUP BY 子句

• SELECT 语句不包含关键字DISTINCT 或行限制关键字如 ROWS,FIRST, SKIP。

 

可选的 WITH CHECK OPTION 子句子句需要可更新的视图,以检查是否新或更新数据满足 SELECT 语句中指定的WHERE 子句的 条件。 每个试图插入新记录或更新现有的一个是检查新的或更新的记录是否符合标准。如果他们没有通过验证,操作是不执行的并返回相应的错误消息。

 

WITH CHECK OPTION能被指定公在CREATE VIEW 语句中的 WHERE 子句是目前主要的 SELECT 语句的输出限制是。否则一个错误将被返回

 

请注意

如果使用了 WITH CHECK OPTION,引擎传递任何之前检查输入与 WHERE 子句对应的基本关系。因此,如果输入检查失败,任何默认子句或基于此关联上的触发器可能已经设计正确的输入永远不会付诸行动。

此外,从INSERT语句中省略的视图字段被传递作为空值给基本关联,不论它们存在或在 where 子句中缺少。因此,基表默认值定义在这些字段上将不会应用。另一方面,触发器将触发且按预期方式工作。

对于没有 WITH CHECK OPTION 的视图,不传递INSERT语句中省略了的字段值到基本关联中,所以任何默认值将应用。

 

视图的创建变成它的所有者。

若要创建一个视图,非管理员用户需要至少选择访问基础表或视图,和对所涉及的任何可选的存储过程的 EXECUTE 特权。

若要启用插入、 更新和删除操作通过视图,在基本对象上创建者/所有者还必须具备相应的INSERT、 UPDATE和DELETE的权限。

在视图上授予其他用户的权限只可能是,如果视图所有者本身在基础对象有这些WITH GRANT OPTION的特权。它将始终是这种情况,如果视图所有者也是底层的对象所有者。

 

 

1. 创建视图返回JOB_CODE和JOB_TITLE列,仅为那些MAX_SALARY小于$15,000的工作.





 

2. 创建视图返回JOB_CODE和JOB_TITLE列,仅为那些MAX_SALARY小于$15,000的工作. 每当一个新的记录被插入或存在的记录被更新,MAX_SALARY < 15000的条件被会验证,如果条件不是真值,那么插入/更新操作将被拒绝.
  



 

3.创建视图带上显示的列列表 .









 

4.创建一视图为字段带上别名帮助在SELECT语句中(结果同例3一样)





 

5.创建一个只读的视图基于两个表和一个存储过程 .
 







 

参阅: ALTER VIEW, CREATE OR ALTER VIEW, RECREATE VIEW, DROP VIEW