DB2 9 根底内情根基(730 测验)认证指南,第 5 部分: 措置 DB2 工具(5)

developerWorks








视图

视图 允许差别的用户或使用顺序以差别的方法搜查相反的数据。这不只使得数据更苟且拜候,还可以用它来限定用户可以搜查或更新哪些行和列。

比方,假定一个公司有一个包罗该公司职员信息的表。司理只需看到他的职员的地址、电话号码和工钱信息,而电话簿使用顺序必要搜查公司中完备绝对职员以及他们的地址和电话号码,但不需搜查他们的工钱。可以建立一个只表现一个特定部门内职员的完备绝对信息的视图,再建立另一个只表现完备绝对职员的姓名、地址和电话号码的视图。

对于用户来说,视图看起来就像表一样。除视图界说之外,视图在数据库内并不占用空间;视图中表现的数据来自另一个表。可以按照现有的一个表(或多个表)、另一个视图或许表和视图的随意组合建立一个视图。在另一个视图的根底内情根基上界说的视图被称为嵌套视图

可以用不同于基表中响应列的列名界说视图。还可以界说一些反省拔出或更新的数据能否一贯写意视图条件的视图。

数据库中界说的视图的列表存储在体系编目表 SYSIBM.SYSVIEWS 中,SYSIBM.SYSVIEWS 还有一个按照它界说的名为 SYSCAT.VIEWS 的视图。体系编目还有一个 SYSCAT.VIEWDEP,对于数据库中界说的每一个视图所依赖的每个视图或表,SYSCAT.VIEWDEP 中都有一行。别的,每个视图都在 SYSIBM.SYSTABLES 中有一个条目,在 SYSIBM.SYSCOLUMNS 中有多个条目,由于可以像表一样利用视图。

建立视图

CREATE VIEW SQL 语句用于界说视图。SELECT 语句用于指定将在视图中表现哪些行与列。

比方,假定想建立一个只表现 BOOKS 表中非小说类书籍的视图:

CREATE VIEW NONFICTIONBOOKS AS 
       SELECT * FROM BOOKS WHERE BOOKTYPE = 'N'


界说这个视图后,SYSCAT.VIEWS、SYSCAT.VIEWDEP 和 SYSCAT.TABLES 中将有对应的条目。

要在视图中界说不同于基表中那些列的列名,可以在 CREATE VIEW 语句中指定它们。以下语句建立一个 MYBOOKVIEW 视图,该视图包罗两列:TITLE(代表 BOOKNAME 列)和 TYPE(代表 BOOKTYPE 列)。

CREATE VIEW MYBOOKVIEW (TITLE,TYPE) AS 
       SELECT BOOKNAME,BOOKTYPE FROM BOOKS 


DROP VIEW SQL 语句用于从数据库中删除视图。要是删除一个视图所基于的表或另一个视图,那么这个视图仍旧在数据库中被界说,但变得不起传染打动。SYSCAT.VIEWS 的 VALID 列讲明视图是无效的(‘Y’)还是无效的(‘X’)。即使重新建立基表,无效的视图仍旧是无效的;必需也重新建立它。

可以从数据库中删除 NONFICTIONBOOKS 视图:

DROP VIEW NONFICTIONBOOKS
          


不克不及点窜视图;要革新视图界说,必需删除视图,然后重新建立它。DB2 供应的 ALTER VIEW 语句只用于点窜引用典型圭臬尺度尺度。









只读视图和可更新视图

在建立一个视图时,可以将它界说为只读视图 或许可更新视图。视图的 SELECT 语句决定视图是只读的还是可更新的。往常情况下,要是视图中的行可以映射到基表中的行,那么该视图就是可更新的。比方,就像背面示例中界说的那样,视图 NONFICTIONBOOKS 是可更新的,由于视图中的每一行都是基表中的行。

建立可更新视图的规律很复杂,它们取决于究诘的界说。比方,利用 VALUESDISTINCTJOIN 特征的视图是不可更新的。颠末议定搜查 SYSCAT.VIEWS 的 READONLY 列很苟且就能确定视图是不是可更新的:Y 表现只读,N 表现非只读。

DB2 SQL Reference 中说明');晰建立可更新视图的过细规律(请参阅 参考材料)。

先前界说的 NONFICTIONBOOKS 视图只包罗 BOOKTYPE 为 N 的行。要是向这个视图中拔出一个 BOOKTYPE 为 F 的行,DB2 将把该行拔出到基表 BOOKS 中。但是,要因此后从视图中中止选择,颠末议定该视图却看不到新拔出的行。要是不想允许用户拔出视图范围以外的行,那么在界说视图时可以利用反省选项。利用 WITH CHECK OPTION 界说视图会让 DB2 反省利用视图的语句能否写意视图的条件。

上面的语句用 WITH CHECK OPTION 界说一个视图:

CREATE VIEW NONFICTIONBOOKS AS 
       SELECT * FROM BOOKS WHERE BOOKTYPE = 'N'
       WITH CHECK OPTION


这个视图仍旧限定用户只能看到非小说类的书;别的,它还制止用户拔出 BOOKTYPE 列的值不为 N 的行,并制止把现有行中 BOOKTYPE 列的值更新为 N 以外的值。比方,下列语句将不再允许利用:

INSERT INTO NONFICTIONBOOKS VALUES (...,'F'); 
UPDATE NONFICTIONBOOKS SET BOOKTYPE = 'F' WHERE BOOKID = 111











带反省选项的嵌套视图

在界说嵌套视图时,反省选项可以用于限定把持。但是,还可以指定其他子句来界说若何承继限定。反省选项可以界说为 CASCADEDLOCAL。要是没有指定要害字,CASCADED 是默许值。为说明'); CASCADEDLOCAL 举动的不同,我们来看几个可以或许的场景。

当用 WITH CASCADED CHECK OPTION 建立视图时,完备绝对针对该视图实行的语句都必需写意视图和完备绝对底层视图的条件 —— 即使那些视图不是带反省选项界说的,也是如斯。假定在建立 NONFICTIONBOOKS 时没有带反省选项,也可以利用 CASCADED 要害字在视图 NONFICTIONBOOKS 的根底内情根基上建立视图 NONFICTIONBOOKS1:

CREATE VIEW NONFICTIONBOOKS AS 
       SELECT * FROM BOOKS WHERE BOOKTYPE = 'N'
CREATE VIEW NONFICTIONBOOKS1 AS 
       SELECT * FROM NONFICTIONBOOKS WHERE BOOKID > 100
       WITH CASCADED CHECK OPTION


将不允许下列 INSERT 语句,由于它们不写意其中至少一个视图的条件:

INSERT INTO NONFICTIONBOOKS1 VALUES( 10,..,'N')
INSERT INTO NONFICTIONBOOKS1 VALUES(120,..,'F')
INSERT INTO NONFICTIONBOOKS1 VALUES( 10,..,'F')


但是, 允许上面的 INSERT 语句,由于这两个视图的条件它都写意:

INSERT INTO NONFICTIONBOOKS1 VALUES(120,...,'N')


接上去,假定用 WITH LOCAL CHECK OPTION 在视图 NONFICTIONBOOKS 的根底内情根基上建立视图 NONFICTIONBOOKS2。目前,针对这个视图实行的语句只必要写意指定了反省选项的视图的条件:

CREATE VIEW NONFICTIONBOOKS AS 
       SELECT * FROM BOOKS WHERE BOOKTYPE = 'N'
CREATE VIEW NONFICTIONBOOKS2 AS 
       SELECT * FROM NONFICTIONBOOKS WHERE BOOKID > 100
       WITH LOCAL CHECK OPTION


在这种情况下,将不允许上面的 INSERT 语句,由于它们不写意 NONFICTIONBOOKS2 视图的 BOOKID > 100 这个条件:

INSERT INTO NONFICTIONBOOKS2 VALUES(10,..,'N')
INSERT INTO NONFICTIONBOOKS2 VALUES(10,..,'F')


但是,虽然值 N 不写意 NONFICTIONBOOKS 视图的 BOOKTYPE = 'N' 这个条件,也会允许上面的 INSERT 语句:

INSERT INTO NONFICTIONBOOKS2 VALUES(120,..,'N')
INSERT INTO NONFICTIONBOOKS2 VALUES(120,..,'F')





版权声明: 原创作品,允许转载,转载时请务必以超链接情势标明文章 原始来由 、作者信息和本声明。不然将追究法令责任。

posted @ 2011-03-07 00:10  蓝色的天空III  阅读(158)  评论(0)    收藏  举报