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

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756257
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756258
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756259
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756260
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756261
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756262
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756263
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756264
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756265
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756266
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756267
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756268
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756259
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756270
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756271
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756272
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756273
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756274
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756275
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756276
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756277
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756278
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756279
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756280
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756281
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756282
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756283
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756274
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756285
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756286
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756287
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756288
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756289
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756290
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756291
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756292
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756293
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756294
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756295
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756296
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756297
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756298
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756289
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756300
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756301
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756302
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756303
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756304
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756305
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756306
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 1 部分: 数据库对象与编程方法(2)-sdccf-ChinaUnix博客
  • 博客访问: 91756307
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-31 23:12:32

利用基本原理构建基础

developerWorks



DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132665) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132664) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132662) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132661) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132660) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132659) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132656) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132655) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132654) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132653) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132652) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132651) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132650) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132649) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132648) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132646) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132645) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132644) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132642) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132641) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132640) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132639) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132638) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132637) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132636) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132635) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132634) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132633) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132632) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132631) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132630) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132628) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132627) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132626) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132625) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132623) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132622) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132619) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132618) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132617) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132616) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


DB2 数据库对象

数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECTUPDATEINSERTSELECT 语句。一些常用的数据库对象如下:

  • 自定义数据类型
  • 约束
  • 视图
  • 索引

如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。

除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。

在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。

例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。

	CREATE TABLE "employee" LIKE employee





回页首


别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:

	CREATE ALIAS aliastab1 FOR tab1;
	CREATE ALIAS bob.aliastab1 FOR tom.tab1;
	CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
				

如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。

使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。

前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。

要给别名添加注释,可使用以下语句:

	COMMENT ON aliastab1 IS 'My first alias on tab1'

要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:

	DROP ALIAS aliastab1





回页首


序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。

标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:



                    	CREATE SEQUENCE myseq AS INTEGER
	    START WITH 360   
	    INCREMENT BY 10
	    NO MAXVALUE
	    CYCLE
	    CACHE 20 

任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINTINTEGERBIGINTDECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。

如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。

默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUEMAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLENO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。

CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。

如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。

可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。

删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。

DROP SEQUENCE myseq RESTRICT





回页首


序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADMDBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:

GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC

如果要更改序列对象的属性,需要有对象的 ALTER 权限:

GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name

请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。

系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。



                    INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar

假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:

1	NAME
-------	-------	
1	BOB
2	PAT
4	PAUL
	
 3 record(s) selected.

虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。

上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。





回页首


顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。

只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。





回页首


要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:

CREATE USER TEMPORARY TABLESPACE usertempspace
 MANAGED BY SYSTEM USING ('usertempspace')

声明全局临时表时,支持很多可选子句。 清单 3 中的例子阐释了它们的行为:



                    DECLARE GLOBAL TEMPORARY TABLE t_dept 
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS 
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace

在清单 3 中的例子中,临时表 t_dept 的声明用了两列。ON COMMIT PRESERVE ROWS 子句说明执行 COMMIT 操作时,将保留临时表中的行。

该例子指定对表的更改是 NOT LOGGED。就是说在表上进行的任何插入、更新或删除操作都不会留下日志记录。但记录表的创建和删除。如果创建表时执行了一组操作,并且在此之后发生了回滚,则该临时表将被删除。另一方面,如果删除表时执行了一组操作,则该表将恢复为没有任何行的空表。

无需使用 IN 子句指定临时表将要使用的用户临时表空间。如果不指定此信息,则 DB2 将搜索最合适的表空间。如果无法找到用户临时表空间,DB2 将引发一个错误。

请看下面的另一个示例:



                    DECLARE GLOBAL TEMPORARY TABLE t_proj 
    LIKE project
    ON COMMIT PRESERVE ROWS
    WITH REPLACE
    IN usertempspace

使用关键字 LIKE 声明临时表 t_proj,因此它拥有与名为 project 的永久表或视图相同的列定义。ON COMMIT PRESERVE ROWS 子句表明在 COMMIT 时将保留临时表中的所有行。因此,它们可以在后面的事务中进一步进行处理。

在同一会话中使用同一名称声明另一个临时表之前,必须先删除原临时表。可显式地完成此操作,也可利用 WITH REPLACE 选项,如清单 4 所示。通过 WITH REPLACE 选项,DB2 隐式地删除所有数据和临时表并使用新定义重新创建该表。

WITH REPLACE 选项与连接入池 一起使用时非常便捷。连接入池是重用数据库连接的一种机制,避免根据需要分配和释放资源。这些操作很耗费资源,尤其是存在大量执行相对较短事务的连接时更是如此。由于没有释放连接,因此可能没有清理以前使用的临时表。使用该连接的下一个应用程序可能获得前面执行所遗留的数据。因此,使用 WITH REPLACE 选项来保证通过新定义刷新临时表。





回页首


大多数数据库对象通过模式对象名 来识别。数据库模式提供数据库对象的逻辑分类。下面是这类由两部分组成的对象名称示例:

DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG

如果访问数据库对象时未指定模式,则建立数据库连接时使用的用户 ID 将被设置为默认模式。例如,如果用户 db2admin 连接到数据库并创建表 T1,则 DB2 将创建名为 db2admin.T1 的表。所有引用时未限定表 T1 的后续 SQL 语句都将被解析为 db2admin.T1。





回页首


DB2 特有的注册项:CURRENT SCHEMA

您可能已经注意到:在数据库操作中,如果用户的用户名就是要操作对象的模式名时,使用用户 ID 有时无法连接到数据库。对应用程序进行硬编码从而完全限定对象也并非最佳解决方案。幸运的是,DB2 允许使用 SET CURRENT SCHEMA 命令更改当前模式。默认情况下,DB2 特有的注册项 CURRENT SCHEMA 被设置为连接数据库的 USER。当更改 CURRENT SCHEMA 时,所有未限定的数据库对象都会加上该新值作为前缀。

可使用以下命令获得当前模式:

VALUES CURRENT SCHEMA

要更改当前模式,可简单地使用下列任意一条命令:

SET SCHEMA=db2admin
SET CURRENT SCHEMA=db2admin
阅读(132615) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~