Chinaunix首页 | 论坛 | 博客
  • 博客访问: 110284676
  • 博文数量: 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博客
  • 博客访问: 110284679
  • 博文数量: 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博客
  • 博客访问: 110284682
  • 博文数量: 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博客
  • 博客访问: 110284685
  • 博文数量: 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博客
  • 博客访问: 110284687
  • 博文数量: 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博客
  • 博客访问: 110284690
  • 博文数量: 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博客
  • 博客访问: 110284694
  • 博文数量: 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博客
  • 博客访问: 110284697
  • 博文数量: 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博客
  • 博客访问: 110284699
  • 博文数量: 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博客
  • 博客访问: 110284703
  • 博文数量: 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博客
  • 博客访问: 110284694
  • 博文数量: 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博客
  • 博客访问: 110284707
  • 博文数量: 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博客
  • 博客访问: 110284711
  • 博文数量: 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博客
  • 博客访问: 110284714
  • 博文数量: 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博客
  • 博客访问: 110284717
  • 博文数量: 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博客
  • 博客访问: 110284705
  • 博文数量: 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博客
  • 博客访问: 110284710
  • 博文数量: 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博客
  • 博客访问: 110284713
  • 博文数量: 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博客
  • 博客访问: 110284715
  • 博文数量: 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博客
  • 博客访问: 110284718
  • 博文数量: 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博客
  • 博客访问: 110284720
  • 博文数量: 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博客
  • 博客访问: 110284724
  • 博文数量: 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博客
  • 博客访问: 110284728
  • 博文数量: 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博客
  • 博客访问: 110284729
  • 博文数量: 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博客
  • 博客访问: 110284733
  • 博文数量: 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博客
  • 博客访问: 110284736
  • 博文数量: 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博客
  • 博客访问: 110284740
  • 博文数量: 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博客
  • 博客访问: 110284742
  • 博文数量: 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博客
  • 博客访问: 110284745
  • 博文数量: 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博客
  • 博客访问: 110284739
  • 博文数量: 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博客
  • 博客访问: 110284751
  • 博文数量: 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博客
  • 博客访问: 110284755
  • 博文数量: 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博客
  • 博客访问: 110284758
  • 博文数量: 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博客
  • 博客访问: 110284762
  • 博文数量: 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博客
  • 博客访问: 110284754
  • 博文数量: 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博客
  • 博客访问: 110284768
  • 博文数量: 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博客
  • 博客访问: 110284770
  • 博文数量: 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博客
  • 博客访问: 110284774
  • 博文数量: 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博客
  • 博客访问: 110284776
  • 博文数量: 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博客
  • 博客访问: 110284765
  • 博文数量: 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博客
  • 博客访问: 110284784
  • 博文数量: 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博客
  • 博客访问: 110284786
  • 博文数量: 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博客
  • 博客访问: 110284790
  • 博文数量: 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博客
  • 博客访问: 110284793
  • 博文数量: 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博客
  • 博客访问: 110284796
  • 博文数量: 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博客
  • 博客访问: 110284800
  • 博文数量: 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博客
  • 博客访问: 110284803
  • 博文数量: 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博客
  • 博客访问: 110284806
  • 博文数量: 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博客
  • 博客访问: 110284795
  • 博文数量: 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博客
  • 博客访问: 110284798
  • 博文数量: 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博客
  • 博客访问: 110284800
  • 博文数量: 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博客
  • 博客访问: 110284804
  • 博文数量: 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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24434) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24433) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24432) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24431) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24430) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24429) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24428) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24427) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24426) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24425) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24424) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24423) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24422) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24421) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24420) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24419) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24418) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24417) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24416) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24415) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24414) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24413) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24412) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24411) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24410) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24409) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24408) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24407) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24406) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24405) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24404) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24403) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24402) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24401) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24400) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24399) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24398) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24397) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24396) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24395) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24394) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24393) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24392) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24391) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24390) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24389) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24388) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24387) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24386) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24385) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

阅读(24384) | 评论(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 的多个版本都支持这一特性。SELECT、DELETE 和 UPDATE 操作符也是允许使用的,只要 DB2 可确定为其应用相应命令的表即可。

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

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

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







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

  • 外部 fullselect 的各 FROM 子句必须仅标识一个基表(无 OUTER 子句)、可删除视图(无 OUTER 子句)、可删除嵌套表表达式或可删除通用表表达式
  • 外部 fullselect 必须未使用 VALUES 子句
  • 外部 fullselect 必须未使用 GROUP BY 或 HAVING 子句
  • 外部 fullselect 必须未在其 SELECT 列表中包含列函数
  • 外部 fullselect 必须未使用除 UNION ALL 之外的集合操作(UNION、EXCEPT 或 INTERSECT)
  • 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 子句),且其目的在于确保任何引用视图的 INSERT 或 UPDATE 语句均应用 WHERE 子句,就必须在定义视图时使用 WITH CHECK OPTION。这一选项可确保数据库中被修改的数据的完整性。如果在 INSERT 或 UPDATE 操作执行过程中违背了条件,将返回 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 触发器来规避限制。

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