搜档网
当前位置:搜档网 › DB2基础教程文档

DB2基础教程文档

DB2基础教程文档
DB2基础教程文档

1.1 DB2 UDB的版本

DB2针对于不同的用户需求,提供了多种版本:

● 企业服务器版(Enterprise Server Edition)

该版本通常用于支持大规模的企业级应用程序以及大型企业级数据仓库,它提供了最大程度的连接性,并且可以与异构平台上的DB2数据库和第三方厂商的数据库产品共享数据资源。

●工作组服务器版(Workgroup Server Edition)

该版本通常用于支持部门级应用程序或者支持那些不需要存取驻留在OS/400、VM/VSE和OS/390平台上的远程数据库的应用程序。

●个人版(Personal Edition)

该版本通常被单机用户使用,功能完备但不能响应远程的数据库请求。该版本只能运行在Linux和Windows 操作系统上。

● Everyplace

该版本是专门为移动计算环境设计的,允许移动用户通过个人数字助理(PDA)和掌上电脑等手持设备存取企业中的DB2数据源。DB2 Everyplace可以执行在包括Palm OS、Linux、Windows CE、Neutrino、PocketPC 和Symbian在内的多种操作系统上。

注:DB2 企业服务器版是以前的DB2 UDB企业版(DB2 UDB Enterprise Edition)和DB2 UDB企业扩展版(DB2 UDB Enterprise-Extended Edition)的合并。以前的DB2卫星版已经被合并到新发行的DB2个人版当中。

1.2 DB2的连接性

DB2提供了很多种方法可以连接到DB2数据库和非DB2数据库。

● DB2客户端

在要存取DB2数据库的远程用户的工作站上必须安装DB2客户端组件。

● DB2 Connect

对于UNIX和Intel平台上的数据库应用程序,如果需要存取OS/400、VM/VSE和OS/390系统上的DB2数据库,则需要DB2 Connect的支持。

注意:任何平台上的数据库应用程序对UNIX和Intel平台上的数据库进行存取,都不需要DB2 Connect的支持。

● DB2 Relational Connect

DB2 Relational Connect允许DB2客户端在DB2数据库和异构数据库(如Oracle)之间进行存取和表的连接(Join)操作。

1.2.1 DB2客户端

针对不同的应用需求,DB2客户端产品有:

● DB2运行时间客户端(DB2 Runtime Client)

在DB2应用程序开发完成以后,只需要在每个要运行DB2应用程序的工作站上安装DB2运行时间客户端即可。

DB2运行时间客户端提供了与DB2服务器和DB2 Connect服务器进行通信的功能。

DB2运行时间客户端可以在远程客户端上交互式地执行SQL语句对DB2服务器和DB2 Connect服务器上的数据进行存取。

DB2运行时间客户端可以运行使用ODBC或OLE DB接口开发的应用程序或运行使用JDBC或者SQLJ接口开发的JAVA应用程序来存取DB2数据库。

● DB2管理客户端(DB2 Administration Client)

DB2管理客户端中除了包含DB2运行时间客户端的全部功能之外,还包含所有的DB2图形化管理工具。

● DB2应用程序开发客户端(DB2 Application Development Client)

DB2应用程序开发客户端中包含了开发DB2数据库应用程序所需要的一组开发工具,用于满足数据库应用程序开发人员的需求。DB2应用程序开发客户端包括所有的DB2图形化管理工具,并且具备DB2运行时间客户端的全部功能。

● DB2瘦客户端(DB2 Thin Client)

DB2可以支持使Type 4的JDBC驱动程序的Java客户端,这样就可以直接利用服务器端的客户端组件对DB2服务器进行存取。在这种情况下不需要DB2运行时间客户端。

1.2.2 DB2 Connect

通过DB2 Connect进行存取的DRDA应用程序服务器可以是OS/390、VM/VSE或者OS/400系统上的任何DB2服务器。

DB2 Connect分为服务器版(又被称为企业版)和单用户版(又被称为个人版)两个版本。

DB2 Connect企业版支持多个客户端同时通过它对主机数据进行存取,它可以将从远程客户端提交过来的数据库请求传递到相应的DRDA应用程序服务器上。远程客户端可以通过任何支持的网络协议与DB2 Connect交流。

DB2 Connect个人版可以被安装在Linux和Windows平台,客户端应用程序只能从安装了DB2 Connect个人版的系统上提交对主机数据库的访问请求。

.3 应用程序开发

DB2提供了丰富多样的应用程序开发环境。DB2应用开发环境有两种版本:

● DB2个人开发版(PDE)—可以运行于Linux和Windows平台。

● DB2通用开发版(UDE)—适用于所有服务器平台。

1.4 DB2管理工具

数据库管理员可以使用很多DB2提供的图形化工具来完成DB2数据库的管理工作。

1.4.1. 控制中心

控制中心是DB2管理工具的核心。它向用户提供了完成几乎所有典型的数据库管理任务所需的工具。

1.4 DB2管理工具

数据库管理员可以使用很多DB2提供的图形化工具来完成DB2数据库的管理工作。

1.4.1. 控制中心

控制中心是DB2管理工具的核心。它向用户提供了完成几乎所有典型的数据库管理任务所需的工具。

1.4.2 命令中心

命令中心提供了一个交互式的图形化界面,允许用户输入SQL命令和DB2命令、执行命令、察看执行结果和语句解释信息。由于提供了强大功能和多方面的灵活性,命令中心成为用户输入文本命令的常用方法。命令中心会记录当前会话中所有执行过的语句和命令

1.4.3 任务中心

任务中心被用于创建、调度和管理包含了SQL语句、DB2命令和操作系统命令的命令脚本。

1.4.4 开发中心

在第8版DB2中,开发中心取代了以前版本中的存储过程生成器。对于开发存储过程、用户自定义函数等例程,开发中心提供了一个易用的界面。

1.4.5 健康中心

DB2提供了一系列的工具来使数据库能够实现自我管理。自我管理和资源调节(智能)数据库技术能够实现数据库操作在配置、调节和管理方面更高程度的自治。

健康中心是一个服务器端的工具,它甚至可以在没有用户干预的情况下对DB2实例的健康状况进行监控。

1.5 DB2 OLAP Server

DB2 OLAP Server是一个可伸缩的、强有力的联机分析处理(OLAP)软件,通过它,用户可以对企业的数据进行非常复杂的计划和分析,并基于分析结果做出决策。

依赖于应用程序的需求,多维立方体既可以被存储在DB2数据库中以增加SQL存取的灵活性,也可以进行多维存储以优化性能。

2.1 表

表是数据记录未排序的集合,包含列和行(通常称为记录)。每列都基于一个数据类型。表一旦创建并填入数据,就可在DML语句的FROM和INTO子句中被引用。有三种表类型:

● 永久表(基表)

● 临时(说明)表

● 临时(派生)表

(1)创建新表:

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

(2)根据已有的表创建新表:

A:create table tab_new like tab_old

B:create table tab_new as select col1,col2… from tab_old definition only

(3)修改表:

增加一个列:

Alter table tabname add column col type

列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。添加主键:

Alter table tabname add primary key(col)

删除主键:

Alter table tabname drop primary key(col)

(4)删除表:

drop table tabname

2.2 视图

视图是从一个或多个表或视图生成的虚拟表(或称逻辑表),可用CREATE VIEW 命令创建。当检索数据时可代替基表。

一旦定义了视图,就可以和基表一样使用,使用DML语句如SELECT、INSERT、和DELETE来存取。

当视图中显示的数据被修改后,在后台表中的数据也相应地修改了。视图本身并不存放真正的数据,在数据库中它只有一个定义。

视图可用于限制对敏感数据的存取而对其它数据则允许进行更宽松地存取。

视图可以是可删除的、可更新的、可插入的以及只读的。不同的类别表明了在使用视图时所能允许的SQL 操作。

通过视图可以使应用程序获得表数据的一个子集并验证插入或更新的数据。视图中列的名字可以和基表中相应的列名不同。视图的使用为应用程序和终端用户查看表中数据提供了一个灵活的方式。

CRAETE VIEW 语句的例子如下所示。基表EMPLOYEE 有SALARY和COMM两列。出于安全性的原因,这个视图中只包含ID、NAME、DEPT、JOB和HIREDATE列。并且只显示DEPTNO为10 的那个部门的员工的信息。

CREATE VIEW EMP_VIEW1

(EMPID,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)

AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE

WHERE DEPT=10;

从上面的例子可以看到,视图可包含WHERE子句以限制对某些行的存取;视图中也可含有列的一个子集,以限制对某些列数据的存取。

视图中列的名字可以和基表中相应的列名不同,表名和视图名都有一个相关联的模式。

2.3 索引

用户对数据库最频繁的操作是进行数据查询。一般情况下,数据库在进行查询操作时需要对整个表进行数据搜索。当表中的数据很多时搜索数据就需要很长的时间。

索引是与单个表相关的物理对象。任何永久表或已声明的临时表都可以定义它们的索引,但不可以在视图上建索引。可以为单个表定义多个索引。

索引是根据指定的一列或多列的内容对行进行排序。索引主要用于提高查询效率,但索引也可以用于逻辑数据设计。例如,主键不允许在同一列中输入相同的值,从而保证了没有一行数据是一样的。

索引可以定义为惟一的或非惟一的。非惟一的索引允许重复的键值。惟一的索引只允许列表中出现一个键值。

索引是使用CREATE INDEX SQL语句创建的。为支持主键或惟一性约束,也可以隐式创建索引。

2.4 模式

模式是数据库实体,一个模式表示DB2数据库中命名对象的一个集合。模式名实际上是数据对象的全限制名称的一部分。当使用CREATE 定义数据库对象时,限制符或模式名出现在数据库对象名称中。

模式名可以使用CREATE SCHEMA语句显式地创建,并指定一个用户作为模式名的拥有者。如果用户BERT想要创建模式名称为DB2的表,那么DBADM可以使用控制中心或者以下语句为BERT创建模式。因为BERT拥有这个模式,所以他可以在模式中创建对象。

create schema db2 authorization bert

如果数据库对象的创建者在数据库对象定义中不包括模式名,那么将使用创建者的授权ID作为模式名(假设没有收回创建者的IMPLICIT_SCHEMA权限)创建对象。

例如,某个用户Mark使用语句CREATE TABLE TABLE1(C1 CHAR(3)) 创建一个表。数据库对象完整的名称应为MARK.TABLE1。

2.5 别名

别名可以用于引用数据库中的表。如果一个应用程序包含有SQL语句,这些语句按照别名存取表,那么可以定义代表不同表的别名,而无需修改应用程序。可以为一个表或别名定义别名。

例如,假设一个叫做Dana的用户创建名为PRICES的表,另一个用户Austin也创建了名为PRICES的表。这些表存储在同一个数据库中,命名为DANA.PRICES和AUSTIN.PRICES。

下面我们创建可以用于所举方案的别名对象。

create alias db2cert.prices for dana.prices

or

create alias db2cert.prices for Austin.prices

然后,就可以开发用DB2CERT.PRICES来引用表对象的应用程序了。应用程序将存取被别名定义为

DB2CERT.PRICES的源的那个表。在一个数据库中,任何时候别名DB2CERT.PRICES只能有一个定义。例如,不能创建DB2CERT.PRICES两次。但是,相同的别名可以用在不同的数据库。

可同一个表或视图创建多个别名。

create alias andrew..prices for db2cert.prices

create alias geoff..prices for db2cert.prices

2.6 约束

在业务处理中,我们通常需要确保始终实施某些规则。例如,公司正式雇员的年龄必须在16-65岁之间。例如,性别的取值应仅为―男‖或―女‖。

DB2 通用数据库为此提供了约束。唯一约束是禁止在表的一列或多列中出现重复值的规则。参照完整性约束(也称为引用完整性约束)确保在整个指定的表中数据一致性。表检查约束是一些条件,它们定义为表定义的一部分,限制一列或多列中使用的值。

(1)关键字

关键字是可用来标识或存取特定行的一组列。

由不止一列组成的关键字称为组合关键字。在具有组合关键字的表中,组合关键字中各列的排序不受这些列在表中排序的约束。

(2)唯一关键字

唯一关键字被定义为它的任何值都不相同。唯一关键字的列不能包含空值。在执行INSERT 和UPDATE 语句期间,数据库管理程序强制执行该约束。一个表可以有多个唯一关键字。唯一关键字是可选的,并且可在CREATE TABLE 或ALTER TABLE 语句中定义。

(3)主关键字

主关键字是一种唯一关键字,表定义的一部分。一个表不能有多个主关键字,并且主关键字的列不能包含空值。主关键字是可选的,并且可在CREATE TABLE 或ALTER TABLE 语句中定义。

(4)外关键字

外部关键字在参考约束的定义中指定。一个表可以有零个或多个外部关键字。如果组合外部关键字的值的任何部分为空,则该值为空。外部关键字是可选的,并且可在CREATE TABLE 语句或ALTER TABLE 语句中定义。

(5)唯一约束

唯一约束确保关键字的值在表中是唯一的。唯一约束是可选的,并且可以通过使用指定PRIMARY KEY 或UNIQUE 子句的CREATE TABLE 或ALTER TABLE 语句来定义唯一约束。例如,可在一个表的雇员编号列上定义一个唯一约束,以确保每个雇员有唯一的编号。

(6)参照完整性约束

通过定义唯一约束和外关键字,可以定义表与表之间的关系,从而实施某些业务规则。唯一关键和外部关键字约束的组合通常称为参照完整性约束。外关键字所引用的唯一约束称为父关键字。外部关键字表示特定的父关键字,或与特定的父关键字相关。

例如,某规则可能规定每个雇员(EMPLOYEE 表)必须属于某现存的部门(DEPARTMENT 表)。因此,将EMPLOYEE 表中的―部门号‖定义为外部关键字,而将DEPARTMENT 表中的―部门号‖定义为主关键字。

(7)表检查约束

表检查约束指定对于表的每行都要进行判定的条件。可对个别列指定检查约束。可使用CREATE 或ALTER TABLE 语句添加检查约束。

下列语句创建具有下列约束的表:

部门编号的值必须在范围10 至100 内

雇员的职务只能为下列之一:"Sales"、"Mgr"或"Clerk"

1986 年之前雇用的每个雇员的工资必须超过$40,500。

CREATE TABLE EMP

(ID SMALLINT NOT NULL,

NAME VARCHAR(9),

DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100),

JOB CHAR(5) CHECK (JOB IN ('Sales', 'Mgr', 'Clerk')),

HIREDATE DATE,

SALARY DECIMAL(7,2),

COMM DECIMAL(7,2),

PRIMARY KEY (ID),

CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) >= 1986 OR SALARY > 40500) )

仅当条件判定为假时才会违反约束。例如,如果插入行的DEPT 为空值,则插入继续进行而不出错,尽管DEPT 的值应该像约束中定义的那样在10 和100 之间。

下列语句将一个约束添加至名为COMP 的EMPLOYEE 表中,该约束为雇员的总报酬必须超过$15,000:

ALTER TABLE EMP

ADD CONSTRAINT COMP CHECK (SALARY + COMM > 15000)

将检查表中现存的行以确保这些行不违反新约束。可通过使用如下的SET CONSTRAINTS 语句将此检查延期:

SET CONSTRAINTS FOR EMP OFF

ALTER TABLE EMP ADD CONSTRAINT COMP CHECK (SALARY + COMM > 15000)

SET CONSTRAINTS FOR EMP IMMEDIATE CHECKED

首先使用SET CONSTRAINTS 语句以延期对表的约束检查。然后可将一个或多个约束添加至表而不检查这些约束。接着再次发出SET CONSTRAINTS 语句,反过来将约束检查打开并执行任何延期的约束检查。

2.7 外连接

最常规的连接,即内(inner)连接。内连接的结果集仅包含在连接表中相匹配的行。

当我们需要连接表中不满足连接条件的非匹配行的数值时,怎么办?这就需要外连接操作。外连接的结果集不仅包含符合连接条件的匹配行,而且还包含不满足连接条件的非匹配行。存在一些不同类型的外连接。在深入讨论外连接的细节前,我们首先看看连接两张表的显式语法。我们将从使用该语法的内连接开始。下面的连接实例给出了一个结果集,该结果集包括test_taken表中的每个考生的名字、电话号码以及最高得分。

SELECT fname, wphone, MAX(INTEGER(score))

FROM db2cert.candidate c

INNER JOIN db2cert.test_taken tt ON c.cid=tt.cid

GROUP BY fname, wphone

在该语法中,与连接操作一起,用户指出要进行连接的表和连接列。

观察上例中的内部连接操作符,它属于语句中FROM子句。INNER JOIN(内连接)操作符规定了在该语句中将使用内部连接。关键词ON用来规定连接表的连接条件。在我们的例子中,连接条件基于连接列,即candidate表的cid列和test_taken表的cid列。

显式连接语法也允许用户指定一个外连接。

1)左外连接(Left Outer Join)

左外连接也称为左连接,其结果集既包括连接表的匹配元组,也包括左连接表(左关系)的所有元组(行)。左连接表是连接操作语句中LEFT OUTER JOIN操作符左边的连接表。

注意:也可以使用LEFT JOIN指示一个左连接操作。

现在要求我们产生一个candidate表中出现的每个考生的名字、电话号码以及最高得分的报表。假如我们采用内连接,正如上例中所示的,报表仅包括在test_taken表中出现的那些考生的数据。

我们将要使用如下所示的左外连接实现该目的。

SELECT fname, wphone, MAX(INTEGER(score))

FROM db2cert.candidate c

LEFT OUTER JOIN db2cert.test_taken tt ON c.cid=tt.cid

GROUP BY fname, wphone

观察左外连接SQL语句的语法,LEFT OUTER JOIN操作符用来表明左外连接操作。在该例中,结果集也包括那些不在test_taken表中的考生,对于那些考生,MAX(INTEGER(score))列将显示空值。

2)右外连接(Right Outer Join)

右外连接也称为右连接,其结果集既包括连接表的匹配元组,也包括右连接表的所有元组。右连接表是连接操作语句中RIGHT OUTER JOIN操作符右边的连接表。

使用右外连接的例子如下所示:

SELECT name, count(DISTINCT char(tt.cid))

FROM db2cert.test_taken tt

RIGHT OUTER JOIN db2cert.test t

ON tt.number = t.number

GROUP BY name

该例将获得test表中出现的所有考试的名字以及计划或已经参加该考试的考生人数。注意,可能有一些考试没有安排考生。使用内连接语句,用户将不能知悉那些没有安排考生的考试,使用右连接却可以做到这一点。

3)全外连接(Full Outer Join)

全外连接操作符产生的结果集不仅包含符合连接条件的匹配行,而且包括两个连接表中的所有记录。

2.8 检查约束

表检查约束在表级上实现数据完整性。一旦在表上定义了表检查约束,每个UPDATE和INSERT语句都会引起限制或约束的检查。如果违反了约束条件,数据记录将不被插入或更新,并且会返回一条SQL错误信息。

表检查约束可在表创建时定义,也可在以后使用ALTER TABLE语句时定义。

通过指定表中每行的一个或多个列的允许值,表检查约束有助于实现对表中数据值的特定规则。这可以节省应用开发人员的时间,因为每个数据值的有效性可以通过数据库而不是通过每个访问数据库的应用程序去执行。

(1)增加检查约束

当在已有数据的表上增加检查约束时,会发生下述两种情况之一:

● 所有的行都满足检查约束。

● 某些行或所有行都不满足检查约束。

第一种情况,所有行都满足检查约束,检查约束将成功创建。若不满足约束业务规则,插入或更新数据的尝试将被拒绝。

当某些行不满足检查约束时,将不创建该检查约束(即ALTER TABLE语句将失败)。如下所示,ALTER TABLE语句在EMPLOYEE表上增加新的名为check_job的约束。DB2通过这个名字来告知INSERT或UPDATE语句失败时违反的是哪个约束。CHECK子句用于定义表检查约束。

ALTER TABLE EMPLOYEE

ADD CONSTRAINT check_job

CHECK (JOB IN(?Engineer‘,‘Sales‘,‘Manager‘));

此处使用了ALTER TABLE语句,因为表早已定义。如果EMPLOYEE表中的值与定义的约束相冲突,将不能成功完成ALTER TABLE语句。

可以关闭约束检查来增加一个新的约束。SET INTEGRITY语句可用于关闭一个或多个表检查约束和引用约束检查。当关闭一个表的检查约束时,它便处于CHECK PENDING状态,只允许对表进行有限的存取。例如,一旦表处于CHECK PENDING状态,就不允许在表上使用SELECT,INSERT,UPDATE和DELETE 等语句。SET INTEGRITY语句的完整句法参见《DB2 UDB V8.1 SQL 参考手册》。

注意:

1.SET CONSTRAINTS语句在DB2 Universal Database V6.1中被SET INTEGRITY语句所代替。SET CONTRAINTS支持向后兼容。

2.给每个约束(触发器,表检查或引用完整性)加上标签是个好主意。这对分析可能发生的错误尤其重要。

(2)修改检查约束

检查约束用于实现业务规则,可能需要经常修改。例如,当组织内部的业务规则修改时就需要修改检查约束。

不过,没有用于修改检查约束的专门命令。每当要修改一个检查约束时,必须先删除它,然后再新建一个。可在任何时刻删除检查约束,而不会影响表及表中的数据。

当删除一个检查约束时,必须意识到由该约束执行的数据有效性检查将不再起作用。用于删除约束的语句是ALTER TABLE。

下例显示如何修改一个已有的约束。在删除约束后,必须用新的定义来创建它。

ALTER TABLE EMPLOYEE DROP CONSTRAINT check_job;

ALTER TABLE EMPLOYEE

ADD CONSTRAINT check_job

CHECK (JOB IN (?OPERATOR‘,‘CLERK‘));

3数据库管理常识

3.1 事务

(1)工作单元(unit of work)

为了确保数据库中数据的一致性,对于应用程序来说,常常必须一步完成一系列数据的变动。这就叫做工作单元。

工作单元是应用程序进程内可恢复的操作序列。工作单元是应用程序用来确保在数据库中不引入不一致数据的基本机制。

在任何时刻,应用程序进程都至少有一个工作单元,在应用程序进程的生存期内可能包括了许多工作单元。

(2 )事务

工作单元也被称为事务(transaction)。任何一个成功地与数据库连接的应用程序都自动地启动一个事务。一个事务将至少包含一条SQL语句。多条SQL语句可以组合在一起作为单个事务执行。DB2将追踪SQL 语句存取或修改的任何数据。这些数据将被永久地改变——提交(committed)或回复到原有状态——-回滚(rolled back)。

事务在执行时遵循―要么不做,要么全做的原则‖,即不允许事务被部分地执行,称为事务的原子性。事务的执行不仅要保证原子性,而且要保证一致性。

通过事务日志可以实现一致性。日志文件用来确保所有被提交的事务真正地应用到数据库。

事务从处理第一条SQL语句时隐含地开始。当显式或隐式地发布COMMIT或ROLLBACK语句后,标志着事务的完成。

应用程序必须通过发出一条COMMIT或ROLLBACK语句去结束该事务。

COMMIT语句告诉数据库管理系统立即对数据库实施事务中的所有数据库变动(插入、更新、删除、创建、变更、授权和撤消)。

ROLLBACK语句告诉数据库管理器不实施这些变动,而将事务中已经发生影响的操作撤消,返回到开始该事务之前的原有状态。

3.2 DB2内置数据类型的存储开销

SMALLINT的数值范围从-32768至32767。每个SMALLINT列占用两个字节的数据库存储空间。

INTEGER数据类型的取值范围从-2,147,483,648至2,147,483,647。每个INTEGER列需占用四字节的数据库存储空间。

BIGINT的范围从-9,223,372,036,854,775,808至9,223,372,036,854,775,807。每个BIGINT列使用八个字节的数据库存储空间。

DECIMAL或NUMERIC数据类型用于表示带小数和整数部分的数。DECIMAL数据以压缩格式存储。一个DECIMAL数占用p/2+1个字节的存储空间,其中p是使用的精度(截去p/2的余数)。

REAL数据类型是一个数的近似值。该近似值需要32位或4字节存储空间。使用REAL数据类型定义一个单精度数,它的长度必须定义在1到24之间。

DOUBLE或FLOAT数据类型是数的近似值。该近似值需要64位或8字节的存储空间。使用FLOAT数据类型定义一个双精度数,它的长度必须定义在25和53之间。

定长字符串使用定义好的存储空间存放在数据库中。如果被存储的数据总是具有相同的长度,那么应当使用CHAR数据类型。如果数据没有使用所定义的存储空间,那么使用定长字符字段有可能潜在地浪费数据库内的磁盘空间。但是存储变长字符串会有一些额外开销。

3.3 系统编目表

DB2中有一些特殊的表,用于存放数据库中所有对象的信息,它们在创建数据库(如使用CREATE DATABASE命令)时创建。这些表称为系统编目表,由DB2在查询过程中检查。系统编目表中包含的信息有:

●表/索引定义

●列数据类型

●定义的约束

●对象依赖

●对象授权

当执行SQL数据定义语言时,系统编目表事实上已更新。在DB2数据库中有许多系统基表和视图,它们总是存放在SYSCATSPACE这个特殊的表空间中。

系统表还包含有关数据库中表的统计信息,如存储在系统编目表中每个表所占用的物理页的数目。这些统计信息时通过RUNSTATS命令来计算和更新的。

数据库对象授权,如INSERT,SELECT和CONTROL,也包含在系统编目表中。

当一个表删除后,它的描述将从编目表中删除,并且引用了该对象的包将变成无效。

4.DB2安全性和存储控制

4.1 安全机制

在通过操作系统或者外部安全设施成功地进行了验证过程之后,DB2内部的安全机制将控制对数据库对象的存取。

对数据库对象的存取控制主要是通过为用户指定某种权限(authority)或授予某些特权(privilege)来进行的。

权限是一组高层次的用户权力,通常授予那些需要对数据库和实例进行管理和维护的用户。

特权是针对于某个数据库对象(如表、视图等)的用户权力,通常授予那些只需要对数据库对象进行存取的用户。例如,一个用户可以在一个表上具有SELECT和UPDATE特权。

4.2 权限

权限用于控制对实例内部对象的存取和能否执行某项管理任务。在DB2中,有5种类型的权限:

● SYSADM—系统管理权限

● SYSCTRL—系统控制权限

● SYSMAINT—系统维护权限

● LOAD—对表进行LOAD操作的权限

● DBADM—数据库管理权限

1)SYSADM权限

SYSADM权限是DB2系统最高级别的权限。

具有SYSADM权限的用户可以执行任何DB2管理操作,也可以对所有的数据库对象进行存取。

SYSADM用户组中的成员是唯一允许对DB2实例进行配置的用户。

2)SYSCTRL权限

SYSCTRL权限允许用户执行大多数的管理任务。但是,SYSCTRL用户组中的成员不能对数据库对象进行存取,也不能对数据库管理器配置文件进行更改。

SYSCTRL权限具有创建数据库的权力,如果具有SYSCTRL权限的用户创建了一个数据库,该用户自动具有该数据库的DBADM权限,可以对该数据库中的数据库对象进行存取。如果该用户需要对其它数据库中的数据库对象进行存取,必须对该用户进行显式授权。

具有SYSCTRL权限的用户具有SYSMAINT权限所包含的所有权力。

3)SYSMAINT权限

SYSMAINT权限允许用户执行系统的维护工作。但是SYSMAINT用户组中的成员不能对用户数据进行存取。

4)LOAD权限

被授予LOAD权限的用户可以在不具备SYSADM或者DBADM权限的情况下使用LOAD工具进行数据导入工作。该权限赋予了用户在数据库管理任务上更加细化的控制。

5)DBADM权限

在数据库级别,最高的权限是DBADM权限。

具有DBADM权限的用户可以在数据库级别执行任何管理任务,比如创建和删除数据库对象、导入数据和监控数据库活动等。

DBADM权限对数据库内的所有数据库对象具有绝对的控制权,除了可以查询、删除和创建任何表之外,还可以将相应数据库对象上的特权赋予其它用户。

数据库的创建者将自动被授予新创建的数据库上的DBADM权限。

4.3 特权

特权是创建或者存取数据库对象的权力。

有两条SQL语句可以用于特权管理:

● GRANT语句用于授予用户特权

● REVOKE语句用于撤销用户已有的特权

下面,我们来看看DB2如何处理对用户和用户组的授权。假设有一个名为austin的用户,我们想赋予该用户candidate表上的SELECT特权,则应当使用下列命令:

GRANT SELECT ON candidate TO austin GRANT SELECT ON candidate TO USER austin

如果在操作系统中不存在名为austin的用户组,以上两条语句都可以将candidate表上的SELECT特权授予用户austin。

假定有一个名为austin的用户组,我们想赋予该用户组candidate表上的SELECT特权,则应当使用下列命令:

GRANT SELECT ON candidate TO austin GRANT SELECT ON candidate TO GROUP austin

如果在操作系统中不存在名为austin的用户,以上两条语句也都可以将candidate表上的SELECT特权授予用户组austin。

但是,如果名为austin的用户和用户组同时存在,语句GRANT SELECT ON candidate TO austin将会引起混淆,系统会提示错误信息。因此,在授权时最好指明是对单个用户授权还是对用户组进行授权。下列语句在授权时就不会带有二义性:

GRANT SELECT ON candidate TO USER austin GRANT SELECT ON candidate TO GROUP austin

像GRANT命令一样,REVOKE命令也带有―USER‖和―GROUP‖选项,用以指明是撤销单个用户的权限还是撤销用户组的权限。

如果一个用户被授予表上的CONTROL特权,则该用户将隐式获得该表上的其它所有特权(包括INSERT、UPDATE、DELETE等),而且该用户还可以将除了CONTROL特权之外的其它所有特权授予其它用户。即使从该用户身上撤销了表上的CONTROL特权,该用户仍然拥有表上的其它所有特权,而且可以将这些特权赋予其它用户。如果需要限制该用户对表的存取,应当使用REVOKE ALL命令显式处理,具体命令如下:

REVOKE ALL ON tablename FROM username/groupname

5并发性

数据库服务器对于一组最终用户而言,其作用是一个存取数据的中心资源。最终用户的数目可能是变化的,从一个用户到数千个用户。当多个用户访问相同的数据资源时,就必须建立关于数据记录的读取、插入、删除、更新的规则,以保证数据的完整性。

数据存取的规则由与DB2数据库相连接的每个应用程序设置。这些规则可以用以下两种方法建立:

显式控制——使用一条SQL语句或DB2命令锁定资源

隐式控制——通过指定一种隔离级别锁定资源

5.1 并发异常

在任何数据库环境中,数据完整性都是人们最关切心的事情。当数据被修改(包括插入和删除)时,数据库服务器必须保证数据的完整性。

执行的每条可执行SQL语句都是事务的一部分。一个事务将至少包含一条SQL语句。多条SQL语句可以组合在一起作为单个事务执行。

下面将讨论事务中出现的一些并发异常,包括:

● 丢失更新(Lost Update)

● 未提交读(Uncommitted read)

● 不可重复读(Nonrepeatable read)

● 幻象读(Phantom read)

5.1.2 未提交读

未提交读(UR)隔离级也称为―脏读‖,它可以用来存取其它应用程序的未提交的数据更新。

5.1.3不可重复读

不可重复读是指在同一事务中,两次执行同样的SELECT语句,得到的结果集不同。非提交读应用程序不能保证可重复读。

为了避免这种类型的不可重复读,所有被查询的数据都应被锁定。假如用户希望被查询的数据不被修改,仅需将这些数据锁定就行了。DB2中,这称为读稳定性(read stability)。假如用户希望所查询的数据在该事务中不再被更改,即可重复读(repeatable read),这就需要附加的锁定。

5.1.4幻象读

假如应用程序将同一查询执行两次,将可能出现幻象读现象。第二次发出同一查询时,返回结果可能新增了一些行。对于多数应用程序,这是一个可以接受的方案。例如,查询涉及寻找音乐会的所有空余座位,则重复发出该查询并获得一个较好的座位选择就是一个满足需求的特点。

根据不同的情况,有时可能需要幻象读。假如用户希望避免幻象读,应用程序必需锁定全部可能限定的行。这将确保没有其它应用程序能够更新、删除或插入可能会影响结果表的行。这是一个需要理解的重要概念。

5.1.2 未提交读

未提交读(UR)隔离级也称为―脏读‖,它可以用来存取其它应用程序的未提交的数据更新。

5.1.3不可重复读

不可重复读是指在同一事务中,两次执行同样的SELECT语句,得到的结果集不同。非提交读应用程序不能保证可重复读。

为了避免这种类型的不可重复读,所有被查询的数据都应被锁定。假如用户希望被查询的数据不被修改,仅需将这些数据锁定就行了。DB2中,这称为读稳定性(read stability)。假如用户希望所查询的数据在该

事务中不再被更改,即可重复读(repeatable read),这就需要附加的锁定。

5.1.4幻象读

假如应用程序将同一查询执行两次,将可能出现幻象读现象。第二次发出同一查询时,返回结果可能新增了一些行。对于多数应用程序,这是一个可以接受的方案。例如,查询涉及寻找音乐会的所有空余座位,则重复发出该查询并获得一个较好的座位选择就是一个满足需求的特点。

根据不同的情况,有时可能需要幻象读。假如用户希望避免幻象读,应用程序必需锁定全部可能限定的行。这将确保没有其它应用程序能够更新、删除或插入可能会影响结果表的行。这是一个需要理解的重要概念。

5.2 隔离级(Isolation Levels)

在前面,已经讨论了一些可能的并发问题。DB2通用数据库提供了不同的保护级别,将每一个数据库应用程序与被存取的数据隔离开来。

这些不同的保护级别即为不同的隔离级或锁定策略。DB2支持的隔离级包括:

● 非提交读(Uncommitted read)

● 游标稳定性(Cursor stability)

● 读稳定性(Read stability)

● 可重复读(Repeatable read)

将包绑定到数据库时,可以使用PREP或BIND命令的ISOLATION选项,定义嵌入式SQL的隔离级。假如没有指定隔离级,则采用游标稳定性的默认隔离级。

假如用户使用命令行处理器,用户可以使用CHANGE ISOLATION LEVEL命令改变隔离级。

对于DB2调用级接口(DB2 CLI),用户可以修改作为DB2调用级配置文件(db2cli.ini)的一部分的隔离级。

5.2.1 未提交读

未提交读(UR)隔离级也称为―脏读‖,是DB2支持的最低级别的隔离级。它可以用来存取其它应用程序的未提交的数据更新。例如,使用未提交读隔离级的应用程序将返回查询的所有匹配行,即使该数据处于被更新的过程之中,并没有向数据库进行提交。

假如用户决定使用这一隔离级,用户的应用程序可能存取不正确的数据。未提交读事务持有的锁很少。当使用这种隔离级时,可能出现不可重复读和幻象读现象。

5.2.2 游标稳定性

游标稳定性(CS,或称光标稳定性)隔离级锁定工作单元期间光标所在的任何行。对该行的锁定将保持到取出下一行记录或整个工作单元终止。假如更新某一行,该锁将保持到整个工作单元终止。当执行COMMIT或ROLLBACK语句时,该工作单元就终止了。

使用游标稳定性的应用程序不能读未提交数据。另外,应用程序锁定当前被取出的行,其它的应用程序都不能修改当前行的内容。

假如用户决定使用这一隔离级,用户的应用程序读取的数据将保持一致性,但不可重复读或幻象读状况仍可能存在。

5.2.3 读稳定性

读稳定性(RS)隔离级锁定作为结果表中的那一部分行。假如用户有一张包含10000行记录的表,查询结果返回10行记录,则仅有10条记录被锁定。

使用读稳定性的应用程序不能读未提交的数据。使用这种隔离级并不是仅有一行被锁定,而是一个事务中所有被读取的行都会被锁定。其它的任何应用程序都不能修改这些行。

假如用户决定使用这一隔离级,则在同一执行单元中多次执行同一查询时,用户的应用程序得到相同的结果。这样可以保证在一个事务中即使多次读取同一行,得到的值不会改变,但读稳定性隔离级不能阻止通过插入操作在结果集中加入新行,即得到新增的幻象行。

5.2.4 可重复读

可重复读(RR)隔离级是DB2中最高级别的隔离级,使用这种隔离级,不仅满足读取条件的行被锁定,应用程序在工作单元内所引用的所有行也将被锁定。无论结果集有多大,构造这个结果集所处理的所有行都持有该锁。表锁可以用来代替大量的因子锁(factor)。

使用可重复读隔离级的应用程序无法读取并发应用中的未提交的数据。假如用户决定采用这种隔离级,那么用户的应用中就不会出现前面所讨论的各种问题(丢失更新、幻象读或不可重复读)。

5.2.5 隔离级的选择

选择合适的隔离级是很重要的,因为它不仅影响并发性,而且影响到应用软件的性能。用户的保护越多(使用的隔离级别越高),并发性就越低。

用户决定在应用程序中哪些并发问题是无法接受的,就选择能防止该问题出现的那种隔离级别:

当用户在只读型表上使用查询,或者仅使用SELECT语句,而并不在意是否从并发应用中获取了未提交数据时,则应使用未提交读隔离级。

当用户需要获得最大的并发度,同时又只要见到并发应用的已被提交的数据,则应使用游标稳定性隔离级。

当用户的应用程序在并发环境中操作时,则应使用读稳定性隔离级。这意味着在整个工作单元工作期间,被限定的行需要保持稳定。

假如用户需要在同一事务中结果集不发生改变,则需要使用可重复读隔离级。

5.3 锁定

DB2通过隔离级来控制并发。在许多情况下,用户不需要采用直接行动来设置锁。通常来说,DB2根据隔离级的语义隐式地获取相应的锁。

5.3.1 锁属性

被锁定的资源叫做对象。用户可以显式锁定的对象仅有表和表空间。其它类型的数据库对象,诸如行、索引键和一些表,DB2根据隔离级和处理情况隐式地获取相应的锁。被锁定的对象代表了锁的粒度。

锁的存取和规则由锁方式(mode)限定。有些锁方式仅用来锁定表对象,而其它的锁方式用来锁定行对象。DB2使用如下的可锁定数据库对象的层次结构:

表空间

5.3.2 锁的升级(Lock Escalation)

如果用户的应用程序修改了表中的许多行,最好对整个表有一个锁,而不是在每一行上有多个锁。对于每个锁,DB2都需耗费内存,因此,假如一个表锁可以代替大量的行级锁,则节省的存储区域可以被其它应用程序使用。

当DB2代替用户将多个行级锁转换为表锁时,则称为锁的升级。为了防止一些单个的锁占用太多的资源,DB2将执行锁的升级,以避免资源浪费。

注意:每个DB2锁都将耗费同样大小的内存。

有两个数据库配置参数对锁升级有直接的影响。它们是:

LOCKLIST --- 定义分配给锁的内存空间大小。

MAXLOCKS --- 定义允许分配给单个应用程序的全部锁列表(locklist)的百分比。

锁升级有两种不同情况:

当某个应用程序超过MAXLOCKS配置参数定义的锁列表的百分比,数据库管理器将试图通过为提出锁请求的应用程序授予表锁并释放行级锁来节省内存空间。

与数据库相连接的多个应用程序由于拥有大量的锁而占满了锁列表。DB2将试图通过获取表锁并释放行级锁来节省内存空间。

还应当注意,应用程序使用的隔离级也对锁的升级有影响,情况如下:

最初光标稳定性将获得行级锁。假如需要,也能获得表级锁。通常每个光标稳定性应用程序只需要数量很少的锁,因为它们只需要保证当前行中数据的完整性。

读稳定性锁定原来结果集中的所有行。

可重复读可以获取、也可以不获取为确定结果集而读取的所有行上的行级锁,假如不获取,可以通过拥有表锁来代替。

5.3.3 锁定表语句(Lock Table)

用户可以使用LOCK TABLE(锁定表)语句重载(override)初始锁方式的规则。它锁定指定的表,直到工作单元被提交或回滚。表可以用SHARE MODE(共享方式)或EXCLUSIVE MODE(排它方式)锁定。

当用SHARE MODE使用LOCK TABLE语句,其它任何程序都不能更新、删除或插入被锁定表中的数据。如果用户需要经常被并应用程序修改的表的快照,就可以使用这一语句去锁定该表的更改,而不对它的应用程序使用可重复读隔离级。

EXCLUSIVE MODE比SHARE MODE更严格。它防止并发应用程序访问该表,进行读取、更新、删除和插入。如果用户准备更新表中的大部分内容,可以以排它方式(EXCLUSIVE MODE),而不是锁定每一行的方式使用LOCK TABLE语句。

数据库管理6UDP产品概述

6.1 控制中心和控制中心的其他工具

控制中心是DB2管理工具的核心。它向用户提供了完成几乎所有典型的数据库管理任务所需的工具。通过控制中心,用户可以方便地调用其它的数据库管理工具来进行数据库系统中的管理工作。具体的工具包括:

● 卫星管理中心(Satellite Administration Center)

卫星管理中心被用于管理多个DB2个人版或工作组服务器版的安装。

● 数据仓库中心(Data Warehouse Center)

数据仓库中心被用于构建数据集市或数据仓库。

● 命令中心(Command Center)

命令中心提供了一个交互式的图形化界面,允许用户输入SQL命令和DB2命令、执行命令、察看执行结果和语句解释信息。由于提供了强大功能和多方面的灵活性,命令中心成为用户输入文本命令的常用方法。另外,命令中心和任务中心之间可以进行互操作。

● 任务中心(Task Center)

任务中心被用于创建、调度和管理包含了SQL语句、DB2命令和操作系统命令的命令脚本。

● 日志(Journal)

日志工具保存了所有脚本的执行记录、所有数据库管理器生成的信息以及DB2恢复历史文件中的信息。日志工具通常被用于察看作业的执行结果、察看被调度脚本的内容、以及启动或终止作业。

● 许可证中心(License Center)

许可证中心被用于管理DB2产品的许可证信息和检查当前并发的连接数目。

● 开发中心(Development Center)

开发中心允许用户创建和测试DB2存储过程或用户自定义函数。

● 工具设置(Tool Settings)

工具设置允许用户对DB2图形工具的某些设置选项进行配置。

6.2 日志

一些日志文件与每个数据库都相关。当处理事务时,处理情况都记录在日志文件中。DB2在数据库日志文件中记录下与该数据库相关的所有SQL语句的情况。

DB2采用预写日志的方法。修改首先被写到日志文件,稍后,再对物理数据库表实施这些修改。

注意:在版本8中,日志文件可达256GB,这样可以允许执行长事务而不会填满日志文件。在某些事件中,事务会超出该限制,现在DB2会―连接‖日志文件,因此在理论上用户永远不会用完日志空间。但是每个一定时间,应用应当提交他们的工作,因此日志的这种连接不会发生。

6.3 复制中心

复制中心是一个允许管理员设置和管理数据复制环境的图形工具。复制预约定义作为脚本被存储在中央控制服务器中。设置一个复制预约的主要工作都可以通过复制中心完成,具体包括:

● 注册复制源

● 监控复制进程

● 运行Capture和Apply程序

● 定义警报条件

6.4 数据仓库管理器

除了DB2数据仓库中心提供的基本功能之外,集成在DB2 UDB中的数据仓库管理器还提供了以下功能:● 数据仓库代理程序增强了数据仓库的功能,它主要负责管理源数据仓库和目标数据仓库中的数据流。

● 可以使用Java存储过程和用户自定义函数来进行高级数据变换,具体的功能包括清除数据、生成数据透视表、生成主关键字和周期表以及计算各种统计信息等。

● 在内部集成了信息目录管理程序,可以引导用户找到进行决策所需的相关信息。

● 通过DB2 Query Patroller进行查询控制和工作负载分配。

● 生成能够满足绝大多数企业需要的报表。

注:数据仓库管理器通过对其他类型数据源、其他类型数据仓库、统计变换和集成的信息目录的支持扩展了数据仓库中心的功能。

6.5 信息目录中心

信息目录中心是一个可以帮助终端用户轻松地发现、理解和访问公司中可用信息的图形化工具。它由数据仓库管理员遵循商业视图模型构造出来,供用户浏览企业信息使用的。具体来说,它提供了以下功能:

● 通过与数据仓库中心以及其它分析和报表工具进行元数据(metadata)交换来填充目录。

● 直接注册共享信息对象。

● 浏览和搜索数据对象以发现相关信息。

● 显示数据对象的元数据。

● 为终端用户启动提供信息的各种工具。

注:信息目录中心保存了终端用户需要存取的元数据。元数据为管理员和商业用户提供了数据仓库中所存储的数据的说明,信息目录中心可以与数据仓库中心自动进行元数据的交换。

6.6Visual Explain

Visual Explain是一个图形化的工具,可以将DB2为SQL语句生成的存取计划以图形的方式直观显示给用户,帮助用户对语句性能进行分析。

6.7 健康中心(Health Center)

IBM的自治运算策略致力于建立一个能够自管理、自诊断和自治愈的IT基础架构。DB2提供了一系列的工具来使数据库能够实现自我管理。自我管理和资源调节(智能)数据库技术能够实现数据库操作在配置、调节和管理方面更高程度的自治。

健康中心是一个服务器端的工具,它甚至可以在没有用户干预的情况下对DB2实例的健康状况进行监控。当定义的阈值被超过了以后(比如日志空间不足),系统会发出警告信息。警告通知可以通过电子邮件或者传呼系统发送。如果不采用发送通知的方法,用户也可以采用命令脚本或者任务的形式预先定义一组行为在出现问题后自动执行。

图形用户界面允许管理员选择数据库对象来察看其详细信息、为当前对象定义的警告以及为解决警告而建议采用的行为。

7UDP产品环境、命令、配置

7.1 DB2环境

DB2环境管理着很多数据库相关要素,比如用于存取远程数据库的网络协议、应用程序搜索DB2相关文件的路径以及分配给数据库和应用程序使用的各种内存区的大小等因素都可以通过DB2环境来控制。DB2环境比较复杂,可以通过以下方式来控制:

● DB2概要文件注册表(DB2 Profile Registry)

● 环境变量

● 配置参数

7.1.1 DB2概要文件注册表

DB2环境中的许多设置都可以通过在DB2概要文件中设定相应的注册表变量来完成。DB2概要文件注册表的作用在于统一DB2环境的设置方法,使得很多关键性的控制因素可以被集中地管理。

下面是一些DB2概要文件注册表变量的例子:

● DB2CODEPAGE

该注册表变量适用于所有平台上的DB2系统,如果不设定,DB2将根据操作系统的代码页设置来设定该注册表变量的值。

相关主题