Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103623860
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623861
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623862
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623863
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623854
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623865
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623866
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623867
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623868
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623869
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623870
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623871
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623872
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623873
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623874
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623875
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623876
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623877
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623878
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623869
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623880
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623882
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623883
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623884
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623885
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623886
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623887
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623888
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623889
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623890
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623891
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623892
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623893
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623884
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623895
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623896
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623897
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623898
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623899
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623900
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623901
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623902
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623903
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623904
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623905
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623906
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623907
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623908
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623899
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623910
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623911
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(5)-sdccf-ChinaUnix博客
  • 博客访问: 103623912
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:18:08

developerWorks



创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23623) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23622) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23619) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23618) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23617) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23616) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23615) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23614) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23613) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23612) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23611) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23610) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23608) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23606) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23604) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23603) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23602) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23601) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23600) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23599) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23598) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23597) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23596) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23595) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23594) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23593) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23592) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23591) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23590) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23589) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23588) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23586) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23585) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23584) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23583) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23582) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23581) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23580) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23579) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23577) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23576) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23575) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23573) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和管理视图

视图 是派生自一个或多个表、视图的虚拟表,在检索数据时,视图与表可交替使用。在您希望隐藏基表的某些列或行时,视图可能非常有用。如果您不希望创建表的另一个副本,可以使用视图来创建虚拟表,仅为用户显示那些您希望他们看到的数据。

通过视图更改数据时,数据将在底层的表本身中发生更改。视图本身并不容纳任何实际数据。在某些情况下,视图不可更新,因此视图可分类为可删除、可更新、可插入或只读。这种分类表示允许对视图进行的 SQL 操作的类型。






通过一个简单的示例即可为您展示视图的强大能力和有用之处。考虑以下 personnel 表:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

这并不是最复杂的 personnel 表,但它能帮我们展示出视图的一个要点。该表包含极为敏感的信息,例如员工工资。但该表中的大部分信息可以供其他部门或用户使用。例如,extension 列(电话号码)应用于生成内部电话号码簿。您该如何充分利用这一信息,而又不会危及工资信息的完整性呢?

您应该能够猜到,解决方案与视图有关。您可以在该表上创建一个视图,限制用户仅查看特定列。如下 SQL 语句创建一个视图,显示用户的姓、名和电话号码:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

允许用户访问此视图而非 personnel 基表。对该视图执行 select 语句的用户只能看到三个列:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

视图可能比这要复杂得多,但本例展示了视图的基本特性。







此时参阅 DB2 SQL 参考指南很有帮助。当然,您或许不方便查看该指南,所以这里给出视图创建的简单语法图:

CREATE VIEW view-name (column list) AS (fullselect)

实际上,这并非此命令语法的所有部分,但的确显示了最常用的部分。CREATE 语句包含如下部分:

  • View-name:此视图的标识符。与实际的表名称具有相同的限制,并且不能与已有的表重名。
  • Column list:这是一个可选的部分,告诉 DB2 在返回结果集时列的名称应该是什么。例如,在前面介绍的示例中,所有列都可重新命名,如下所示:

    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
    

  • Fullselect:SQL 将使用这部分来生成视图定义。fullselect 部分可以基于 WHERE 子句返回单独的行,也可进行联结、聚合或其他复杂的 SQL 操作。






视图与表可通过 UNION ALL 联结,DB2 的多个版本都支持这一特性。SELECTDELETEUPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

在 DB2 中,对 INSERT 操作符的支持已通过 UNION ALL 扩展到视图,只要以下条件成立即可:

  • 表达式具有相同的数据类型
  • 至少有一个列上存在约束,可用于惟一地标识应在哪里插入行,并且约束的范围无重叠

只要被更改的列不违背该列的约束,那么以这种方式定义的视图还支持 UPDATE 操作。在这种情况下,用户必须首先 DELETE,然后再 INSERT 记录。







根据视图的定义方式,视图可以是可删除的。可删除视图是一个您可成功对其执行 DELETE 语句的视图。对于一个视图能否视为可删除视图,有以下几条规则需要遵循:

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BYHAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNIONEXCEPTINTERSECT
  • UNION ALL 操作对象中的基表不得是同一个表,且各操作对象必须可删除
  • 外部 fullselect 的 SELECT 列表不得包含 DISTINCT

一个视图必须满足上述全部规则,才能被视为可删除视图。







可更新 视图是可删除视图的特例。如果一个可删除视图中至少有一个列是可更新的,那么就可将其视为可更新视图。只有在满足以下所有规则的条件下,视图的一个列才是可更新的:

  • 视图必须可删除
  • 列必须解析为表的一个列(未使用解除引用操作),必须指定 READ ONLY 选项
  • UNION ALL 的操作对象的所有相应列都必须具有恰好匹配的数据类型(包括长度或精度及范围),如果视图的 fullselect 包含 UNION ALL,那么必须具有匹配的默认值






可插入 视图允许您使用视图定义插入行。如果一个视图的所有列都是可更新的,那么该视图就是可插入视图。例如,考虑以下 PERSONNEL 表及其相关视图 TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

TELEPHONE_BOOK 视图不是可插入视图,因为插入语句不包含 SALARY 字段,而此字段不可为空。但若原始的表定义中包含 SALARY 字段的 DEFAULT 子句,或者该字段允许为空,那么此视图就是可插入视图。

只读 视图是一个不可插入视图(参见 可插入视图)。如果一个视图确实 符合可插入视图规则中的至少一条,则该视图是只读视图。

如果视图是只读的,那么可根据它定义 INSTEAD OF 触发器,指示应如何进行插入。

INSTEAD OF 触发器仅用于视图,不可用于基表。其特征与普通触发器类似,但具有以下限制:

  • 仅用于视图
  • 总是 FOR EACH ROW
  • 空值作为 DEFAULT 值传递
  • 不能通过 INSTEAD OF UPDATE/DELETE 触发器在视图的游标上使用定位 UPDATE/DELETE

定义一个 INSTEAD OF 触发器来处理插入操作不明确的情况,避免只读视图的限制。







如果视图定义中包括条件(例如 WHERE 子句),且其目的在于确保任何引用视图的 INSERTUPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERTUPDATE 操作执行过程中违背了条件,将返回 SQL 错误。

使用 WITH CHECK OPTION 的视图定义示例如下。WITH CHECK OPTION 是必需的,它可确保条件总是得到检查。在本例中,您希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。使用视图来插入新值时,总是强制使用 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

若该子句不存在,任何人都不可能使用该视图来更新记录,使之不再是视图的一部分。例如,如下 SQL 语句将导致某些问题。

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

该语句的结果是视图不包含任何记录,因为部门 10 中没有员工。







无效 视图是一个对于 SQL 语句不再可用的视图。若以下条件成立,则视图将成为无效视图:

  • 视图定义所依赖的特权被撤销。
  • 视图定义所依赖的对象(如表、别名或函数等)被删除。
  • 视图定义所依赖的另一个视图变成无效视图。
  • 视图定义(子视图)的父视图变成无效视图。

在 DB2 中,视图不能更改,如果要更改,则必须用希望应用的更改重新创建视图。







视图是显示数据而不必维护数据的一种有效手段。视图并非实际的表,也不需要任何永久性存储。

视图可以包含自身所基于的表中包含的部分或全部列。例如,您可在一个视图中联结 department 表和 employee 表,这样即可列出特定部门中的全部员工。

视图中可以包含一个选项,保证视图上的插入和更新不违背视图定义。

视图允许在满足特定标准的条件下对基表进行插入、删除和更新。即便一个视图不可更新,但可编写一个 INSTEAD OF 触发器来规避限制。

阅读(23572) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~