2011年(20)
分类: 数据库开发技术
2011-05-19 11:17:19
1.视图概述
视图是从一个或多个基表(或视图)导出的表。通常视图仅仅是一个虚表,即数据库中只存放视图的定义信息等元数据,而不存放视图对应的数据。视图上的操作和基表类似,但是 DBMS对视图的更新操作(INSERT、DELETE、UPDATE)往往存在一定的限制。 DBMS对视图进行的权限管理和基表也有所不同。
视图可以提高数据的逻辑独立性,也可以增加一定的安全性。 DBMS在处理视图时和基表存在很多不同的地方,例如:
本文主要讨论视图的可更新性,即考虑视图上的更新类操作存在哪些特点和限制。
2.SQL92定义的可更新视图
若一个视图是从单个的基表导出的,并且只是去掉了基表的某些行和列,且保留了基表的主码,这样的视图被称为行列子集视图。SQL92中对可更新视图的支持非常有限,主要就是上述的行列子集视图。 SQL92中对可更新视图的要求如下:
根据SQL92的定义,一个视图要么是可更新的,要么是不可更新的,二者必居其一。SQL92 也不允许视图中某些列可以更新,某些列不可以更新。
3.SQL99(SQL3)定义的可更新视图
SQL99放宽了对可更新视图的限制,甚至还区分了视图是否可插入、列是否可 LL、连接查询生成的视图可更新。
4.主流 DBMS对可更新视图的支持
(1)MS SQL Server 2000
SQL Server 2000 除了支持SQL标准规定的可更新视图,还提供了两种扩充:
对于不具备上述两种特性的视图, SQL Server 遵照SQL标准的规定做了如下限制:
CREATE VIEW NoTable AS
SELECT GETDATE() AS CurrentDate,
@@LANGUAGE AS CurrentLanguage,
CURRENT_USER AS CurrentUser;
SELECT CURRENT_USER;
MEMBER TABLES
表可以是本数据库中的,也可以是其他数据库中的,也可以是通过 OPENDATASOURCE 或 OPENROWSET-based引用的。
同一个表只能在 CREATE VIEW语句中出现一次。
不能在compute column上建有索引。
表的主码必须类似(建在同样的列上)。
所有表的 ANSI padding设置一致。
其他关于分布式分区表的限制
(2)ORACLE 8i/9i
ORACLE允许用“WITH READ ONLY”子句显式地指定视图是只读的。若视图不带上述子句,则ORACLE遵照SQL标准提出了以下限制:
我们还可以用INSTEAD OF 触发器来实现视图的更新。详细的信息还请参考文献[7]。
(3)DB2V8
DB2将视图区分为可删除视图、可更新视图、可插入视图、只读视图、不可用视图等。这样的划分应该更为合理,也比较好理解。DB2的可更新视图:
也可以用INSTEAD OF 触发器来实现视图的更新操作。详细的信息还请参考文献[8]。
主要的几个 DBMS 都实现了 SQL92 定义的可更新视图,SQL99 定义的可更新视图也或多或少的得到了支持。但是需要注意的是,产品之间对可更新视图的实现程度是有差异的,而且由于它们支持的SQL语法存在一些差异,要书写可移植的 SQL 语句需要特别注意。
5.可更新视图的进一步探讨
E.F.Codd提出了评价全关系系统的12条准则。其中的准则6就是讨论视图的更新的。准则6的内容如下:
准则6:视图更新准则。所有理论上可以更新的视图也应该允许由系统更新。
理论上可以更新的视图指的是对视图的更新要求,存在一个与时间无关的算法,可以无二义性地把更新要求转换为对基表的更新序列。视图更新准则对于系统对数据的逻辑独立性支持是非常重要的。