实践教学
 
实验教学大纲

Database Principle and Application

一、实验的目的与任务
数 据库原理与应用是软件工程专业的一门专业课程,它不仅具有较强的理论性,而且具有一定的实践性,本实验正是根据这一特点而设置的,它是理论教学的深化和扩 充,是加强学生对理论知识的理解,培养学生独立工作能力和创造力必不可少的环节。本课程以帮助学生建立数据库概念、掌握数据库基本原理、提高数据库的应用 能力和分析问题能力为教学目标。在实验中就是要使学生在理解基本原理的基础之上,能够进行数据库的设计和开发。

二、实验的基本要求
1. 要求学生独立完成上机操作实验,掌握db2关系数据库管理系统的基本操作和使用。
2. 要求学生能够运用数据库的原理知识、关系数据库管理系统和前端开发工具设计和开发数据库应用系统。
3. 要求学生具有运用数据库技术解决问题的能力。

三、实验内容与学时分配

序号 实 验 项 目 学时 类型 性质 校内外是否有协作单位 备注
1 数据库设计 16 综合 必做 否 
      

四、实验教材(讲义)、参考资料
教 材:《数据库原理与DB2应用实验指导书》,自编讲义。

参考资料:DB2 Universal Database Administration Workshop for Windows,IBM Certified Course Material (Course Code CF231)
Relational Database Design, IBM Certified Course Material (Course Code CF18)
DB2 Family Fundamentals, IBM Certified Course Material (Course Code CF03)
DB2 SQL Workshop, IBM Certified Course Material (Course Code CF12)
DB2 Universal Database Programming Fundamentals,IBM Certified Course Material (Course Code CF10)
数据库系统原理教程. 王珊,陈红编著. 清华大学出版社. 1998年7月

五、实验成绩的考核
依据学生在上机过程中的态度及表现、实验报告来综合评定并给出数据库原理与应用实验课程的平时成绩,成绩按20%记入总成绩。

 

实验指导书

实验名称:数据库设计

实验目的及要求
目的:
创 建DB2系统管理员用户,创建实例,创建DB2系统管理员组,设置系统变量,更改必须的数据库管理器配置参数;在DB2中创建数据库,创建表空间(包括运 行一个脚本文件来创建多个表空间),访问包含表空间信息的SYSCAT视图,列出表空间信息,列出容器信息;在实验二的基础上创建表,索引,视图,别名, 给表添加引用完整性约束,检查约束和触发器,访问有关数据库对象的系统编目信息,查询/删除/修改表的内容;使用IMPORT实用程序把数据库从文件中插 入表中,使用LOAD实用程序快速的把数据从文件中装入表中,创建例外表,管理检查约束,触发器和检查挂起状态;创建数据库表空间的备份镜像,从备份镜像 恢复数据库,前滚数据库或表空间来执行完全恢复,执行操作来重新激活处于例外状态的数据库等;使用快照监控器来进行基本的锁监控,区分锁超时和死锁的概 念,修改有关超时和死锁的数据库配置参数;熟悉PUBLIC组的默认特权,DB2管理权限(SYSADM,SYSCYRL,SYSMAINT和 DBADM)和每种权限的操作能力,授予特权给个人和组,演示何时组特权可用和何时需要个人特权等。通过以上实验使学生在理解基本原理的基础之上,能够进 行数据库的设计和开发。
要求:
熟悉DB2的实验环境
掌握设计数据库的过程
实验类型
综合类型
实验学时
16学时
实验设备
计算机及联网环境
实验步骤及内容
步骤一:DB2实验环境设置
实验目的和要求:
1.建立拥有系统管理权限(SYSADM)的新用户(inst1)和组(adm1)
2.建立新的DB2实例(INST1)
3.增加一些新的系统变量,并且更新DBM CFG以反映刚刚创建的新的系统管理用户组
第一部分:设置系统日期,时间和时区
改变Windows系统日期时间和时区设置:
点击屏幕左下角的Windows开始菜单
选择设置->控制面板,在弹出的控制面板窗口双击时间和日期
在该属性窗口中选择时区页
第二部分:建立新用户
在控制面板中双击"用户帐户"选项,根据提示按以下要求创建新用户:
用户名:inst1
全名:inst1 Instance SysAdmin
描述:System Administrator for INST1 Instance
密码:inst1
用户组:Administrators
第三部分:退出当前以用户Admin登陆的系统,然后以用户INST1的管理员身份登陆到操作系统
在以后的实验中,当要求登陆到系统中时,除特别说明外都是要求以INST1身份登陆。
第四部分:创建实例
1.在DB2的Windows版本安装完成后,系统会自动建立一个默认名为DB2的实例。
要验证该DB2实例确实存在,可以打开DB2命令窗口并输入db2ilist命令。(选择开始菜单->程序->IBM DB2->命令行工具->命令窗口;输入db2ilist)
2.db2ilist命令显示DB2是该主机的一个实例。
3. 出于实验环境的需要,你将要建立另一个称为inst1的新实例。在命令窗口中输入如下命令:db2icrt inst1
4.为得到当前实例列表,再次输入db2ilist命令,将会发现inst1实例已成功创建。
5.输入exit退出DB2命令窗口。
第五部分:按以下要求建立DB2系统管理员用户组adm1(adm1应小写而且),并且使inst1和db2admin成为该组成员
组名:adm1
描述:inst1 Instance SysAdmin Group
成员:db2admin;inst1
第六部分:设置环境
1. 执行以下任务以检查当前DB2环境变量,并且设置刚刚建立的inst1实例为系统默认实例。
打开控制面板的系统属性窗口,选择高级标签页,然后点击环境变量按钮。
弹 出的环境变量窗口被分为上下两部分,上半部分所定义的用户变量只影响当前用户而系统变量则影响每一个用户。查看系统变量中DB2INSTANCE所对应的 值,默认情况下为DB2,现将其改为inst1.双击系统变量列表框中"DB2INSTANCE DB2",在编辑系统变量窗口的变量值一栏中输入
inst1,然后点击确定按钮。

双击系统变量列表中的"PATH"一栏,可见PATH系统变量值中包含路径"X:/SQLLIB/bin",因此"X:/SQLLIB/bin"下的可执行文件可直接在命令提示符下启动.
启动DB2-inst1和DB2DAS - DB2DAS00服务,并将其启动类型设置为自动
双 击控制面板的管理工具选项,启动其中的"服务"窗口,在服务列表中右键单击"DB2 - INST1",在弹出菜单中选择"属性";在"DB2-inst1的属性"窗口中,将"常规"标签页中的"启动类型"设为自动;然后单击启动按钮,等到服 务状态显示为已启动时,点击"DB2-inst1属性"窗口上的确定按钮。用同样的方法设置"DB2DAS - DB2DAS00"服务的启动类型为自动,并检查该服务是否已启动,如果尚未启动则启动该服务。然后关闭服务窗口和控制面板(DAS也可以通过 db2admin start和db2admin stop来启动和关闭)。
2. 选择开始菜单->程序->附件->命令提示符;输入: set | more
检查DB2环境变量是否设置正确,假如不对重复上面必要的步骤予以纠正。
3. 在DB2命令窗口输入db2set -all命令来检查DB2注册表变量,DB2ADMINSERVER的值为DB2DAS00, DB2SYSTEM的值与主机名相同。
(注:使用带-all 选项的db2set命令可以查看系统中设置的所有配置文件注册表变量)
4. 为了对实例inst1和全局注册表变量提供tcp/ip协议的支持,输入如下命令设置DB2COMM变量:
db2set DB2COMM=TCPIP -i inst1
db2set DB2COMM=TCPIP -g
(注:要设置当前实例的一个参数时输入格式为 db2set parameter=value
要为特定实例设置参数值时输入格式为 db2set parameter=value -i instance_name
要设置一个全局级的注册表变量时输入格式为 db2set parameter=value -g
要查看能够被设置的所有配置文件注册表变量,可输入db2set -lr)
5. 再次查看注册表变量。输入db2set -all,注意在输出列表中实例级的注册表变量旁边标以"[i]",全局级的注册表变量旁边标以"[g]"。
6. 重启操作系统,并以用户inst1登陆(用户密码按照先前所设都为inst1)。
第七部分:使用DB2控制中心来查看和设置数据库管理器配置参数
选择开始菜单->程序->IBM DB2->一般管理工具->控制中心
1. 在控制中心窗口中选择主机名左边的"+"号
2. 选择"实例"左边的"+"号,如果"实例"下没有列出inst1,则右键单击"实例",在弹出菜单中选择"添加",在"添加实例"窗口中的"远程实例名"栏输入"inst1",点击"应用"按扭,再点击"取消"按扭。
3. 查看数据库管理器配置文件。为了查看或更改数据库管理器配置文件,右键单击控制中心里的"inst1"实例,在弹出菜单中选择"配置参数"
4. 根据"DBM 配置"窗口,记录下列值:
" 管理"下的AUTHENTICATION 参数是否有一个值,设置该参数的目的是什么,该参数有哪些可能值。(点击AUTHENTICATION 参数,选择该参数所对应的值,并点击值右边的省略号按扭,在弹出的"更改 DBM 配置参数-AUTHENTICATION"窗口中列出5个值:"服务器", "客户机", "服务器加密", "Kerberos"和"Kerberos加密"。其中"服务器"选项是指验证过程将在服务器上进
行,这是DB2默认的身份鉴别方式。点击"取消"按钮关闭"更改 DBM 配置参数-AUTHENTICATION"窗

口)。"管理"下的SYSADM_GROUP参数有值吗? 值是什么,该参数所关联的提示是什么。(该参数为实例定义具有系统管理SYSADM权限的组名,值必须是一个由用户管理器创建的组名。默认情况下
SYSADM_GROUP 并没有值,这意味着Windows的管理员用户将会继承DB2的SYSADM权限。如果你想更改这种默认的设置,可以先建立一个用户组,该组拥有一些特定 成员,然后将该组名设置为SYSADM_GROUP参数值,只有该组的成员才拥有SYSADM权限)。
查看"环境"下的NODETYPE参数值是什么。(参数值为"带有本地和远程客户机的数据库分区服务器",注意到该参数是由DB2设置的,且不能被更改)
5. 更新SYSADM_GROUP参数,设置它的值为adm1 (在"DBM 配置"窗口中选择SYSADM_GROUP的值,然后点击该值右边的省略号按钮,在系统管理权限组下输入"adm1",点击"确定"按钮,点击"DBM 配置"窗口中"确定"按钮,再点击弹出的"DB2 消息"窗口的"关闭"按钮)
6. 为了使刚刚的设置生效,重新启动inst1实例。右键单击INST1,并在弹出菜单中选择"停止",点击"确定"按钮,再点击"关闭"按钮。右键单击INST1,并在弹出菜单中选择"启动"。如果系统显示错误的消息,请阅读相关的错误信息,你将在下一步修正该错误
7. 如果收到一个SQL5043N错误信息,这是因为未能成功启动对一个或多个通信协议的支持,尽管核心数据库管理器功能启动成功。
在 本实验第六部分的第四小节,我们将db2comm参数值设为tcpip。当INST1实例启动时,DB2会试着启动该通信协议,但是却未能找到一个服务端 口来使用。因此在数据库管理器配置文件中,我们需要设置参数SVCENAME,来指定一个端口号或者一个服务文件入口名,来为前来访问的TCP/IP客户 端服务。
8. 更新TCP/IP服务名(SVCENAME参数),设置它的值为55000。 在控制中心中右键单击INST1,并在弹出菜单中选择"设置通信",在"设置通信-INST1"窗口中令TCP/IP复选框选中,并且单击该复选框右边? quot;属性"按钮,在"配置 TCP/IP - INST1"窗口中的服务名一栏输入INST1(或者其他名),再在端口号一栏中输入 55000 ,连续单击"确定"按钮关闭这些配置窗口。
9. 重新启动实例。在控制中心的对象树中右键单击"实例"下的INST1,在弹出菜单中选择"停止";
点击"确定停止"窗口的"确定"按钮,等待一段时间系统会弹出消息窗口,关闭该窗口;
在控制中心的对象树中右键单击"实例"下的INST1,在弹出菜单中选择"启动",关闭弹出的DB2消息窗口?/p>

步骤二:创建数据库/表空间
实验目的和要求:
A. 建立数据库。
B. 建立表空间。
C. 执行脚本文件来建立多个表空间。
D. 访问那些包含表空间信息的SYSCAT视图。
E. 列出表空间相关信息。
F. 列出容器相关信息。
第一部分:创建数据库
1. 创建数据库可以通过DB2命令create database来完成。首先通过在线帮助工具来查看create database指令语法。
点击控制中心的工具栏第四个图标(或选择菜单"工具->命令中心"),启动命令中心。
在命令中心中选择"交互式"标签页,并且在"命令"下的文本框中输入" ? create database"。
选择菜单"交互式->执行"(或ctrl+enter,或点击左上角工具栏的齿轮图标)。
2. Create database命令中可以指定哪些信息呢?[问题1]
[数据库名﹑数据库位置(控制文件﹑设定文件﹑事务日志文件以及默认的表格空间要建立在什么位置)﹑数据库别名﹑国别区码﹑排序集﹑默认数据块大小,该语句也可为编目表空间﹑临时表空间﹑用户表空间指定特定值。]
3. 当数据库建立时会创建那几个表空间?[问题2][SYSCATSPACE﹑USERSPACE1和TEMPSPACE1]。
4. 默认情况下,数据库会使用哪种表空间,系统管理表空间SMS?数据库管理表空间DMS?[问题3][系统管理表空间SMS]
5. 如果on 参数未指定的话,create database命令将会使用默认数据库路径,该默认路径通过数据库管理器配置文件来设置
要查看该默认路径,右键单击控制中心中的INST1,并在弹出菜单中选择"配置参数",在"管理"下查看DFTDBPATH参数的值,DFTDBPATH参数值为"驱动器名:"(在以后实验中均设DFTDBPATH值为X:)。
6. 查看INST1实例中有多少个数据库在运行。点击控制中心实例INST1下的"数据库",可见INST1下没有数据库运行。
7. 通过"创建数据库向导"创建数据库。在控制中心中,右键单击INST1下的"数据库",在弹出菜单中选择"创建->使用向导创建数据库"。
8. 根据向导查看该数据库将建立在哪个默认驱动器上?[问题4][驱动器X:]
9. 根据向导创建数据库。在向导的"名?quot;页面中,数据库名一栏输入MUSICDB,其它值均按默认设置,点击"下一步"按钮。
10. 继续该向导,查看设置用户表空间﹑目录表空间﹑临时表空间的三个页面,注意建立这些表空间的默认类型是什么。(选择向导左边的"用户表" ﹑"目录表" ﹑"临时表"标签页,或者点击相应页面的"下一步"按钮即可完成相关设置。这些表空间的默认类型都是SMS。
11. 在向导的"性能"页面中,因为MUSICDB的表空间均按照系统缺省设置,所以你不能修改数据块大小或者预取大小。(但是如果你为用户表﹑目录表﹑临时表 设置了特定的容器,那么还是可以通过"性能"页面设置数据块或预取大小)点击"下一步"按钮开始数据库"区域"的设置。
12. 向导的"区域"页面可以设置数据库的语言环境和整理顺序,系统已自动设置完成这些选项,直接点击"下一步"按钮。
13. 在向导"总结"页面中点击"显示命令"按钮即可查看创建该数据库的全部命令,点击"关闭"按钮关闭"显示命令"窗口。点击"总结"页面的"完成"按钮。等 待一小段时间,系统就会弹出"DB2消息"窗口提示数据库已经创建完毕,并且询问是否启动"配置顾问程序"来调整数据库。点击"否"按钮关闭该窗口。这 时,你所创建的MUSIC数据库会出现在控制中心对象树中"数据库"节点下。
14. 系统数据库目录包含了当前实例下所有数据库的条目信息,可以在命令中心输入命?quot;list db directory"来查看系统数据库目录中MUSICDB的信息
15. 运行"命令中心",选择"交互式"标签页,输入list db directory,然后点击窗口左上角工具栏上第一个齿轮图标或按Ctrl+Enter。在下方的输出窗口中,注意到MUSICDB的别名为 MUSICDB,数据库建立时如果未设置别名,系统会自动为它设置一个与数据库名相同的别名。
16. 本地数据库目录/驱动器实际上是一个包含数据库条目信息的目录,系统通过这些条目信息知道数据库所在位置。可以通过list db directory的输出查看到MUSICDB数据库目录为X:/INST1。
17. 目录条目类型的"间接"是指该数据库为本地数据库(运行在同一主机),而"远程"是指数据库运行在另一个远程系统中。本实验"list db directory"的输出中,MUSICDB的目录条目类型为"间接"。
18. 每一数据库驱动器路径都包含一组本地数据库目录,这些本地数据库目录用于存取子目录中的本地数据库,该目录中存储的每个条目包含着数据库名称﹑数据库别名 以及数据库类型和数据库的位置等等信息。可以在命令中心中输入如下的交互式命令来查看MUSICDB的本地数据库目录:list db directory on X: (注意命令中应根据具体情况的不同为X:选择合适的替代盘符)。执行该命令后,MUSICDB的数据库目录为SQL00001
19. 以下的实验需要连接到MUSICDB数据库,首先在命令中心输入如下命令来检查现在的连接状态:get connection state
20. 执行该命令后,输出窗口显示连接状态为"可连接而未连接"。
21. 输入如下命令连接到MUSICDB: connect to MUSICDB
22. 再次输入命令"get connection state"检查连接状态,输出窗口显示连接状态为"可连接并已连接"。
23. 每一个数据库都有它自己的数据库配置文件,该文件包含了该数据库的相关信息和配置参数。要查看MUSICDB数据库配置文件,可在控制中心的对象树中右键单?quot;MUSICDB",并在弹出菜单中选择"配置参数",弹出"数据库配置-MUSICDB"窗口。
24. 数据库的一些配置参数是可以被更改的,在命令中心中输入命令"update db cfg for MUSICDB using maxlocks 20 num_freqvalues 12"将每个应用程序的最大锁定数设为20,并将保留的高频值数目设为12。
25. DB2 Version 7及以前的版本,需要重启数据库后,参数的更改才能生效。而DB2 version8中有许多(但并非全部)参数更改后会立即生效。如果在下达update db cfg命令后得到信息"DB20000I UPDATE DATABASE CONFIGURATION 命令成功完成",则表示更改已经生效。对于上面输入的命令,更改会立即生效。
26. 在命令中心中输入如下命令查看MAXLOCKS和NUM_FREQVALUES的当前值与延迟值是否相同
connect to MUSICDB
get db cfg for MUSICDB show detail
通过输出窗口可见这两个参数的当前值和延迟值是一致的。
27. 当数据库创建时,DB2实例级数据库管理器配置文件中的DFTDBPATH用来指定在该实例下创建数据库的缺省文件路径,如果创建数据库时没有指定路径, 则将在此参数指定的路径中创建该参数。本实验中INST1的DFTDBPATH为X:。在Windows命令提示符窗口中输入下列命令来查看数据库创建时 生成哪些文件,注意不要编辑﹑移动或删除这些文件,否则会损坏依赖这些文件的数据库。
选择"开始菜单->程序->附件->命令提示符",输入:
x:
dir /w
在X盘下, INST1实例下创建的数据库文件存放在X:/INST1目录中。输入:
cd INST1
dir
INST1目录下,NODE0000是在单机(单分区)DB2环境中的固定目录名称,继续输入:cd NODE0000
Dir
NODE0000目录下,SQL00001包含了MUSICDB数据库文件,其他目录(SQLDBDIR)则包含了本地数据库目录文件。
进入SQL00001目录,输入:
cd SQL00001
dir
文件SQLDBCON为数据库配置文件,SQLOGDIR目录包含了日志文件,db2rhist.asc则为恢复历史文件,SQLT0000.0﹑SQLT0001.0﹑SQLT0002.0三目录也在SQL00001下。
28. 数据库创建时,三个表空间也同时被创建,在命令中心中输入命令list tablespaces可查看这些表空间的相关信息。
29. 通过上述命令查看MUSICDB每个表空间名称和标识
SYSCATSPACE--ID 0
TEMPSPACE1--ID 1
USERSPACE1--ID 2
30. 表空间容器信息可以通过命令list tablespace containers获取。要查看MUSICDB中标识为0的表空间容器信息,可输入命令:list tablespace containers for 0。 该容器类型为路径/目录,此目录为X:/INST1/NODE0000/SQL00001/SQLT0000.0。
31. 在命令中心中输入命令list tables for system列出系统目录表和视图,这些表和视图存储在SYSCATSPACE表空间中。
32. 在命令提示符窗口中输入cd SQLT0000.0,dir /w | more。输出列表中,以.dat为后缀名的文件为表数据文件,以.INX为后缀名的文件为索引文件,以.Lb或.LBA为后缀名的文件为大对象数据文 件,注意到SQL00003上没有索引,而SQL00012和SQL00017上建立了索引,且SQL00012包含大对象数据。
33. SYSCAT模式拥有所有建立在系统目录表上的视图,我们可通过该模式的这些视图来访问系统目录表。例如在命令中心中输入如下命令查看所有模式为"SYSIBM"(即系统目录表)的表名和表标识号:
select tabname, tableid from syscat.tables where tabschema='SYSIBM' and type='T'
34. 表标识号TABLEID与目录H:/INST1/NODE0000/SQL00002/SQLT0000.0下文件SQLTABLEID.DAT相对应, 因此对于SYSIBM.SYSTABLES,它的标识号TABLEID为2,所以SQL00002.DAT包含了它的表数据,在它上面所建立的所有索引都 包含在SQL00002.INX中,且它的大对象数据存储在SQL00002.LB中。
35. 输入如下命令查看临时表空间和默认用户表空间的容器信息
list tablespace containers for 1
list tablespace containers for 2
临时表空间的默认路径为X:/INST1/NODE0000/SQL00001/SQLT0001.0
用户表空间的默认路径为X:/INST1/NODE0000/SQL00001/SQLT0002.0
第二部分:建立表空间
1. 数据库MUSICDB需要额外的几个表空间,本节我们通过控制中心来创建其中一个表空间。而其余表空间将由一个名为CRTBLSP的脚本命令文件来创建。
在控制中心创建其中第一个表空间,且这个表空间应具备下列特性:
类型为常规;
空间管理系统为DMS;
表空间名为dms01;
具有一个文件型容器,且该容器的路径应为:X:/dms/dms01,大小为160个4Kb页面;
数据块大小为4个4KB页。
在控制中心的左边的对象树上,单击数据库"MUSICDB"左边的"+"图标;
右键单击MUSICDB下的"表空间",在弹出菜单中选择"创建";
在"创建表空间向导"的第一页中,指定新表空间的名称为dms01,并点击"下一步";
在向导的"类型"页面,选择表空间的类型为常规,并点击"下一步";
在"空间管理"页面,选择该表空间为数据库管理表空间,并在下一步的"容器"页面中,点击"添加"按钮,弹出"定义容器"窗口。
选择容器大小的计算单位为4KB页,并在大小一栏输入160,选择驱动器为X:,在容器一栏输入dms/dms01,然后点击"确定"按钮。继续点击"下一步"按钮;
在向导的"读/写"页面,将数据块大小设置为4 个4KB页面;
设 置完该表空间的所有性质后,单击"总结"页面的"显示SQL"按钮查看刚才所作的设定,SQL语句应为:CREATE REGULAR TABLESPACE DMS01 PAGESIZE 4 K MANAGED BY DATABASE USING ( FILE 'X:/dms01' 106 ) EXTENTSIZE 4 OVERHEAD 10.5 PREFETCHSIZE 4 TRANSFERRATE 0.33 BUFFERPOOL "IBMDEFAULTBP" DROPPED TABLE RECOVERY OFF,点击"关闭"按钮关闭"显示SQL"窗口;
点击向导的完成按钮。
2. 在命令中心中输入命令list tablespaces show detail检查新创建的表空间。(注:应先connect to MUSICDB)
3. 现在将通过在命令中心执行脚本命令文件来创建其他剩余的表空间。
4. 在加载并执行脚本之前,首先要检查命令中心的选项和工具设置,你必须完成下面设置:
应启动自动提交功能;
若发生错误,则停止执行SQL语句;
命令文本应能回送至输出;
分号应作为语句的终止符。
在命令中心中,选择"命令中心->选项"菜单,选择"命令中心选项"窗口的"执行"标签页,确保"自动落实SQL语句"和"若发生错误则停止执行"两选项都被选中,选择"结果"标签页,确保"详细(将命令文本回送执输出)"选项被选中,然后点击"确定"按钮。
选择"工具->工具设置"菜单,选择"工具设置"窗口的"一般"标签页,确保该页面的"使用语句终止符;"选项被选中。关闭"工具设置"窗口。
5. 通过执行脚本文件CRTBLSP创建其余表空间,该脚本在X:/cf23目录下。
在命令中心中,选择"脚本"标签页,选择菜单"脚本->导入";
确保"导入"窗口中的系统名一栏与Windows系统名一致。
选择驱动器一栏为X:/;在路径一栏输入完整的脚本文件的路径,或者选择目录和文件列表框找到CRTBLSP脚本,单击"确定"按钮。该脚本将创建dms02,dms03,dms04,dms05,dms06和sms01六个表空间,执行该脚本。
6. 在控制中心中列出刚刚创建的表空间。
在控制中心对象树中右键单击MUSICDB下的表空间,并在弹出菜单中选择"刷新"。
7. 在控制中心里并不能查看到表空间的标识号,但可通过在命令中心中输入list tablespace看到。表空间及其关联的标识号如下:
SYSCATSPACE-ID 0
TEMPSPACE1-ID 1
USERSPACE1-ID 2
DMS01-ID 3
DMS02-ID 4
DMS03-ID 5
DMS04-ID 6
DMS05-ID 7
DMS06-ID 8
SMS01-ID 9
8. 在Windows命令提示符窗口中输入如下命令:
X:
cd dms
dir
列表中文件即为DMS表空间的容器。
9. 在命令中心中输入命令查看表空间的详细信息:list tablespaces show detail。
10. 在上述命令输出列表查看DMS表空间的可用页数
DMS01-100
DMS02-12
DMS03-720
DMS04-20
DMS05-14
DMS06-36
SMS表空间并不使用预先格式好的容器,因此SMS的目录容器所在的文件系统中可用空间的变动会直接影响到SMS表格空间的容量,而DMS表空间则要设置预留空间的大小。
11. 查看标识号为3的表空间的容器的详细信息
list tablespace containers for 3 show detail
容器类型为文件,且该文件为X:/dms/dms01。
12. 查看标识号为9的表空间的容器的详细信息
list tablespace containers for 9 show detail
容器类型为路径/目录,且路径为x:/sms/sms01和x:/sms/sms02
13. 表空间的信息也可通过视图SYSCAT.TABLESPACES来访问,该视图中包含表空间信息的列有:
TBSPACE-表空间名
DEFINER-表空间创建者的用户名
TBSPACEID-表空间的内部标识号
TBSPACETYPE-表空间类型,D代表DMS,S代表SMS
DATATYPE-表空间可存储的数据的类型。L代表只能存储大对象数据对象,A代表所有永久对象,T代表只能存储临时表。
为回答接下来的问题,命令中心中输入SQL语句:
select tbspace, definer, tbspaceid, tbspacetype, datatype from syscat.tablespaces
14. 默认表空间的创建这是谁 ?[问题5][DEFINER=SYSIBM]。
15. 哪个表空间只允许存储大对象数据?[问题6][DMS03]。
16. 哪个表空间只允许存储临时表对象?[问题7][TEMPSPACE1]。
17. 特定的表所相关的表空间信息可以通过SYSCAT.TABLES视图来访问,该视图中包含表空间信息的列有:
TBSPACEID-该表所在的主表空间内部标识号;
TBSPACE-该表所在的主表空间名称;
INDEX_TBSPACE-包含该表索引的表空间;
LONG_TBSPACE-包含该表大对象数据的表空间,
为列出表SYSIBM.SYSTABLES所在表空间的信息,可在命令中心输入如下SQL语句:
select tabname, tbspaceid, tbspace, index_tbspace, long_tbspace from syscat.tables where tabname='SYSTABLES'
18. SYSIBM.SYSTABLES表分布在两个不同的表空间吗?[问题8][不,一个表不能分布在两个不同的SMS表空间]。
19. 在命令中心中输入命令connect reset断开与MUSICDB的连接。

 

步骤三:创建数据库对象
实验目的和要求:
A. 建立表
B. 建立索引
C. 建立视图
D. 建立别名
E. 对其中一表添加参照完整性约束
F. 对其中一表添加检查约束
G. 对其中一表添加触发器
H. 访问这些对象相关的系统编目信息
第一部分:创建表
1. 在控制中心创建表artists,该表应满足下列要求
表的模式为inst1
表名为artists
该表的一般数据存储在dms01表空间
该表的索引存储在dms02表空间
该表的大对象数据存储在dms03表空间
列artno应定义为该表主键
列定义如下所示:
(artno smallint not null,
name varchar(50),
classification char(1) not null,
bio clob(100K) logged compact,
picture blob(500K) not logged compact)
2. 检查artists表建立得是否正确
在控制中心左边的对象树中右键单击MUSICDB下的"表" ,在弹出菜单中选择"刷新",再在右边的内容面板中找到artists表,查看该表。如果该表不符合要求,则将其删除,然后再返回第一步重新建立。
3. 导入脚本文件准备创建其余表
通过名为CRTABLES的脚本文件创建其余表,该脚本文件在目录X:/cf23下,在命令中心的脚本模式下导入该脚本,在执行它之前,先查看脚本内容,注意表STOCK、CONCERTS、REORDER将分别把表数据和索引放在哪些表空间?
4. 按Ctrl+Enter执行脚本文件。
5. 列出刚创建的所有表。
在控制中心左边的对象树中右键单击MUSICDB下的"表" ,在弹出菜单中选择"刷新",然后再在右边内容面板中查看脚本所创建的表,确保这些表都建立得正确。
6. 要查看表的详细信息,可以在内容面板中右键单击所要查看的表,在弹出菜单中选?quot;改变"。使用此方法查看Albums表。
7. 查看模式INST1所有表的列信息
表的列信息可以通过SYSCAT.COLUMNS视图查询到。在DB2命令行处理器输入如下指令执行X:/cf23下的tabchk.sql脚本,并将输出结果重定向到tabchk.file中:
打开"开始菜单->程序->IBM DB2->命令行工具->命令窗口",输入:
X:
Cd /cf23
db2 connect to musicdb
db2 -tf tabchk.sql > tabchk.file
more tabchk.file
或者输入 db2 select tabname, colname, typename from syscat.columns where tabschema = 'INST1' order by 1,2 > tabchk.file
8. 检查输出文件tabchk.file与 tabchk.master内容上有什么差别?[问题1]
[须确保两文件的内容没有任何差别,首先在命令提示符下输入指令:
fc /w tabchk.file tabchk.master | more
如果输出消息显示"FC:找不到相异处",tabchk.file与tabchk.master相一致。如果输出显示两个文件某些行不相同,则应仔细检查相应错误,删除建立不当的表,并返回到上步重新建立。]
9. 某个表所相关的表空间信息可以通过SYSCAT.TABLES视图来获得。输入一条SQL语句来从SYSCAT.TABLES获取模式INST1下所有表 的表名(TABNAME)、存储该表数据的表空间(TBSPACE)、存储该表索引的表空间(INDEX_TBSPACE)信息,并将结果集按表名排序。 完整的SQL语句为:
select tabname, tbspace, index_tbspace from syscat.tables where tabschema= 'INST1' order by tabname
X:/cf23下的脚本文件tbschk.sql包含该SQL语句,在DB2命令窗口中进入x:/cf23目录下,输入:
db2 -tf tbschk.sql > tbschk.file
more tbschk.file
10. 检查输出文件tbschk.file与 tbschk.master内容上有什么差别?[问题2]
[fc /w tbschk.file tbschk.master | more
如果输出消息显示"FC:找不到相异处",tbschk.file与tbschk.master相一致。如果输出显示两个文件某些行不相同,则应仔细检查相应错误,删除建立不当的表,并返回到上步重新建立。]
11. 通过在命令中心中导入执行X:/cf23下的GRANTS脚本,将inst1模式下所有表的select权限授予public,并在脚本执行完毕后检查权限授予是否成功。

第二部分:创建索引
1. 在stock表的itemno列上建立名为item的索引。
控制中心的对象列表中右键单击MUSICDB下的"索引",并在弹出菜单中选择"创建",在"创建索引"窗口中按下列要求填入相关信息:
索引模式为INST1;
索引名为item;
表模式为INST1;
表名为stock;
在"可用的列"中选择itemno并单击">"按钮将该列加入到"选择的列"中,然后点击"确定"

按钮。
2. 用同样方法在控制中心中为albums表的itemno列建立唯一索引,该索引的要求如下:
索引模式为INST1;
索引名为itemno;
表模式为INST1;
表名为albums;
在"可用的列"中选择itemno并单击">"按钮将该列加入到"选择的列"中,并且选中"唯一"复选框,然后点击"确定"按钮。
3. 控制中心列出所创建的索引,在控制中心对象树中,单击MUSICDB下的"索引"。
注意到内容面板中第一个CC开头的索引。当创建artists表时,因定义了一主键,db2会自动为主关键字段建立一个唯一索引。
4. 有关索引的信息可以通过SYSCAT.INDEXES视图获取。在DB2命令窗口中,输入如下指令获取模式INST1下所有索引的所在表 (TABNAME)前十八个字符、唯一性规则(UNIQERULE)、索引名(INDNAME)前十八个字符和索引所在列列名(COLNAMES)前三十 个字符,并将输出结果按表名和索引名排序:
Db2 "select substr(tabname,1,18),uniquerule,substr(indname,1, 18),substr(colnames,1,30) from syscat.indexes where indschema=user and uniquerule<>'p' order by 1, 3 "
(注:必须先执行db2 connect to musicdb)
5. 上述的SQL语句同样包含在X:/cf23下的indchk.sql脚本中,在DB2命令窗口中执行indchk.sql脚本,将结果重定向到indchk.file中去,并检查indchk.file和indchk.master文件内容是否有差异?[问题3]
[db2 -tf indchk.sql > indchk.file
fc /w indchk.file indchk.master | more
如果输出显示两文件内容存在差异,则应仔细检查相关信息,删除建立不当的索引并重建。]
第三部分:建立视图
1. 在控制中心中建立一名为music的视图。
控制中心的对象列表中右键单击MUSICDB下的"视图",在弹出菜单中选择"创建";
选择视图的模式为INST1;
视图名一栏中输入music;
点击SQL语句框右边的"清除"按钮,并输入:
as select title, classification, name from INST1.albums, INST1.artists where INST1.artists.artno= INST1.albums.artno ;
点击"确定"按钮。
2. 在命令中心的脚本模式下导入执行X:/cf23下的CRVIEW文件,创建另一视图。
3. 在控制中心的对象树中右键单击MUSICDB下的"视图",并在弹出菜单中选择"刷新",然后可见在右边的内容面板中列出了新建立的视图。
4. 视图的相关信息可以通过SYSCAT.VIEWS和SYSCAT.TABLES来获取。
List tables同样可以列出数据库中的视图(类型为V)。
命令中心中输入如下命令,查看新建立的视图是否列出:
connect to MUSICDB;
list tables for user;
或者connect to MUSICDB;

select viewschema, viewname from syscat.views where definer=user;
第四部分:建立别名
1. 在控制中心中为artists表建立别名singers,为reorder表建立别名emptystock。
2. 别名的相关信息可以通过视图SYSCAT.TABLES来获取,此外list tables命令也能获取当前连接的用户下的别名列表。
输入如下命令列出别名列表:
connect to MUSICDB;
list tables for user;
或者select tabname, type from syscat.tables where tabschema=user;
第五部分:在表artists与albums之间以及albums与stock之间添加参照完整性约束。
1. 修改albums表,并且为它定义与其它表的参照完整性约束。
在 该表itemno列上建立主键。在控制中心中右键点击albums表并在弹出菜单中选择"改变",再在"改变表-albums"窗口中选择"键"标签页, 点击"添加主键"按钮,在"定义主键"窗口"可用的列"中选择itemno,然后点击">"按钮,并点击"确定"按钮。
为该表定以外键。点 击"添加外键"按钮,在"添加外键"窗口中,表模式一栏选择INST1,表名一栏选择artists,注意这时主键框内显示该表主键为artno,再选择 "可用的"列中artno,点击">"按钮使该列成为外键,选择"删除时"一栏为CASCADE,约束名为fkartno,点击"确定"按钮
2. 在命令中心脚本模式下执行CRRI脚本,该脚本修改STOCK表并为其定义参照完整性约束。
3. 参照完整性约束的相关信息可通过SYSCAT.REFERENCES视图获取。当删除主表的某些数据导致子表中某些数据的外键没有对应的主键值时, DELETERULE描述了一组规则:若DELETERULE为N,主表的记录可删除,而子表中外键与之对应的记录的外键字段会被设成空值;若 DELETERULE为C,父表的记录可以被删除,而子表中外键值与之对应的记录也一并被删除,若DELETERULE为R,则对父表的删除操作会失败。
在命令中心中输入如下SQL语句获取INST1模式下所有参照完整性约束的名称、所在表名、参照表的模式、参照表名、删除规则、外键所在列名、主键所在列名:
select constname, tabname, reftabschema, reftabname, deleterule, fk_colnames, pk_colnames from syscat.references where tabschema='INST1'
4. 参照完整性约束的相关信息也可通过SYSCAT.TABLES视图来获取。在命令中心中输入如下SQL语句,其中CHILDREN为参照该表的所有表的个数,PARENTS为该表所要参照的表的个数:
select tabname,parents,children from syscat.tables where tabschema='INST1' and (parents>0 or children>0) order by 2,3 desc
5. 在DB2命令窗口中执行脚本richk.sql,通过SYSCAT.TABLES视图获得当前连接的用户模式
参照完整性约束的相关信息,richk.sql的内容为:
select substr(tabname,1,18),parents,children from syscat.tables where tabschema = user order by tabname
db2 -tf richk.sql > richk.file
more richk.file
然后检查该输出文件的内容与richk.master有无差别:
fc /w richk.file richk.master | more
如果输出显示两文件内容存在差异,则应仔细检查相关信息后重新修改表。
第六部分:为stock表添加检查约束
1. 修改stock表并为该表添加检查约束,该约束应符合下列要求:
约束名为cctype;
该约束确保stock表type字段的取值必须是字符'D'、'C'、'R'之一。
在控制中心中右键单击stock表,在弹出菜单中选择"改变",在"改变表-stock"窗口中选择"检查约束"标签页,点击"添加"按钮,再在检查条件框中输入:
type in ('D', 'C', 'R')
约束名一栏输入cctype,点击"确定"按钮关闭"添加检查约束"窗口,再点击"确定"按钮关闭"改变表-stock"窗口。
2. 检查约束的相关信息可通过SYSCAT.CHECKS、SYSCAT.COLCHECKS、SYSCAT.TABCONST和SYSCAT.TABLES这些视图获取。
在命令中心中输入:
select constname, tabname, colname from syscat.colchecks
3. 在命令中心中输入如下SQL语句,列出的约束中,TYPE为K表示是一个检查约束,TYPE为P表示是一主键,TYPE为F表示是一外键
select constname, tabname, type from syscat.tabconst
4. DB2命令窗口中输入如下命令执行脚本ckchk.sql,并将输出结果重定向到ckchk.file:
Db2 -tf ckchk.sql > ckchk.file
More ckchk.file
然后检查该输出文件的内容与ckchk.master有无差别:
fc /w ckchk.file ckchk.master | more
第七部分:为 reorder表创建触发器,当stock表某一存货少于6时,reorder表中将会插入一条新记录
将要建立的触发器应具备下列性质:
触发器名为reorder;
触发时机为更新stock表某些记录的qty字段值后该字段值小于或等于5;
新记录变量new通过n来引用;
该触发器将新记录变量的itemno值和当前时间截插入到reorder表;
应为for each row mode db2sql触发器。
右 键单击控制中心MUSICDB下的"触发器",在弹出菜单中选择"创建",在创建触发器窗口中,输入触发器模式选为INST1,表或视图模式选为 INST1,触发器名为reorder,表或视图名称选为stock,触发操作的时间选为"之前",导致执行触发器的操作设为"更新列"并选择qty列, 然后选择"触发操作"标签页,在"新行的相关名"中输入n,在触发操作框内填入如下SQL语句:
when (n.qty<=5)
insert into reorder values (n.itemno, current timestamp)
点击"显示SQL"按钮查看完整的SQL语句。
点击"确定"按钮,然后在控制中心查看该触发器是否列出。
触发器的相关信息可以通过SYSCAT.TRIGGERS和SYSCAT.TRIGDEP获取,在命令中心中输入如下SQL语句:
select trigname, tabname,trigevent from syscat.triggers
其中trigevent为I表示触发操作为insert,D表示触发操作为delete,U表示触发操作为update。
在命令中心中输入下列SQL语句:
select trigname, btype, bschema, bname from syscat.trigdep

步骤四:移动数据
实验目的和要求:
A. 使用import工具从一文件读取数据写入表格;
B. 使用load工具从一文件读取数据快速写入表格;
C. 建立异常表;
D. 管理检查约束,触发器以及检查暂挂状态。
第一部分:使用import工具导入数据到artists表,稍后执行脚本文件导入数据到albums和stock表。首先用用户名inst1登陆。
1. 使用import工具导入数据到artists表,导入数据时应注意下面几点:
导入的数据存储在X:/cf23下的artists.exp文件中;
该文件为ixf格式;
导入方式为insert;
所有消息记录到文件X:/cf23/art.msg。
在控制中心中右键单击artists表,在弹出菜单中选择"导入";
在"导入表-artists"窗口中,按要求输入下列信息:
"导入文件"一栏输入X:/cf23/artists.exp;
"导入文件类型"设为集成交换格式(IXF);
"导入方式"设为INSERT;
"消息文件"一栏输入X:/cf23/art.msg,单击"确定"按钮。
2. Windows命令提示符窗口中输入more < art.msg,查看消息文件中的警告或错误信息,并注意有多少行数据成功插入表中。
3. 在命令中心的脚本模式下导入并执行X:/cf23/imp_albu,该脚本将数据导入到albums表中。脚本执行完毕后查看消息文件x:/cf23/albums.msg是否有任何附加信息,并注意有多少行数据成功插入表中。
4. 继续导入并执行X:/cf23/imp_sto,该脚本将数据导入到stock表中。执行完毕后查看消息文件x:/cf23/sto.msg是否有任何附加信息,并注意有多少行数据成功插入表中。
5. 上次实验曾在表stock上建立了触发器reoder,当更新该表某些记录的qty字段值后该字段值小于或等于5时,该触发器将被触发。为检查当数据导入到stock表时触发器是否被触发,在命令中心中输入如下SQL语句:
connect to musicdb;
select * from stock where qty <= 5;
select * from reorder;
import工具实际利用INSERT指令一次写入一笔数据。在导入数据的过程中,DB2会检查输入的数据是否符合该表格上所定义的约束,触发器也会正常运作,但是该导入过程没有更新数据,所以reorder触发器没有被触发。(注:load工具不会启动触发器)
第二部分:创建异常表-artists,albums,stock

所 有的异常表将存储在SMSEXP表空间,注意异常表的定义与原表非常相似,前N列的列名和数据类型与原表精确匹配。第N+1列为可选列,数据类型为 timestamp。第N+2列也为可选列,且只有在第N+1列存在时才能被创建,该列必须定义成32KB或更大的CLOB类型,用来存放导致该行被拒的 特定约束信息。
在命令中心脚本模式下导入并执行脚本crexptab,该脚本分别为artists、albums、stock
创建异常表artexp、albexp、stoexp。
第三部分:在使用load工具之前备份数据库MUSICDB
数据库备份与恢复的细节将会在以后的实验有所涉及。本实验第五部分将使用载入工具的替换模式,要使后面的操作可恢复,应先在db2命令窗口中输入如下命令:
X:
Cd /
Md X:/backup
Db2 force application all
Db2 backup db MUSICDB to X:/backup
第四部分:使用load插入模式载入数据到concerts表
1. 按下面要求载入数据到concerts表:
要载入文件为X:/cf23下的concerts.exp;
concerts.exp文件为ixf格式;
载入数据使用插入模式;
载入过程中所有消息重定向到X:/cf23/concerts.msg文件当中;
2. 查看消息文件concerts.msg,注意有多少行成功载入并插入到表中:
more < concerts.msg
第五部分:使用load工具的替换模式载入数据到表artists中
1. 在命令中心载入并运行脚本load_art。
2. 本次载入使用了与前次import不同的IXF输入文件,且使用了替换选项将先前导入的行替换掉。Artexp被指定作为artists的异常表,在带有异常选项的载入过程中,所有违反唯一限制(主键或唯一索引)的数据行将会放入artexp。
3. 查看artexp表中是否存有那些违反artists上唯一键索引的数据行,在命令中新脚本模式下导入并执行selexp。
4. 查看消息文件X:/cf23/load_art.msg内容:
more < load_art.msg
第六部分:使用SET INTEGRITY命令管理检查暂挂状态
1. 在命令中心导入并执行脚本seltab,该脚本将对表artists、stock、albums执行查询操作,查看执行结果。
2. 上述脚本执行后返回SQL0668原因代码1,命令中心中输入:
? SQL0668
因为这些表处于检查暂挂状态,所有对这些表的数据操作都不能执行,输出信息同时提示用户
执行SET INTEGRITY语句以消除表的检查暂挂状态。
3. 在命令中心中执行脚本listtbst查看这些表上检查约束的状态。Artists表处于检查暂挂状态。
4. SET INTEGRITY语句可被用来检查数据是否违反参照完整性约束,处于检查暂挂状态的表(artists表)应被指定一个与它对应的异常表。在命令中心中导入并执行setcsts_arts脚本来检查artists表中参照完整性约束。
5. 在命令中心中输入警告"sql3601"指什么?[问题1] [Sql3601,由帮助信息可知set integrity语句导致一个或多个表处于检查暂挂状态]。
6. 命令中心中导入并执行listtbst脚本,执行后可见albums和stock表处于检查暂挂状态。
7. 命令中心中输入并执行脚本setcsts_2,为albums和stock表设置完整性,检查它们上的参照完整性,并指定它们的异常表。
8. 对artists、stock、albums表执行查询操作以确认这些表已消除检查暂挂状态,在命令中心中导入并执行脚本listtbst和seltab,执行结果表明检查暂挂状态都以消除。
9. 为解除检查暂挂状态,那些违反约束的行被移动到异常表中。在命令中心中导入并执行脚本selexp察看异常表中的数据。
10. 从stock移动到Stoexp的数据以及从albums移动到albexp的数据,这些数据的外键值都无法与artists表中的主键相匹配。执行下列SQL语句在artists表中插入一行数据:
insert into artists (artno, name, classification) values (100, 'Patti & Cart Wheels', 'S')
11. 现在要将stoexp和albexp表中的行分别插入到表stock和albums中,首先执行脚本selexp查看两异常表中数据,检查两异常表的MSG列,注意并不需要将N+1和N+2列数据插入到stock和albums表。
12. 在命令中心中导入并执行脚本insexp将stoexp和albexp中的数据插入到表stock和albums,insexp脚本也会对stock和albums执行查询操作以检查异常表中数据是否成功插入到原表。
第七部分:理解检查约束的强制执行
1. 回顾上节实验中为stock表的TYPY列添加的检查约束cctype。在命令中心中右键单击表stock并在弹出菜单中选择"改变",再在"改变表-stock"窗口中选择"检查约束"标签页,选择cctype约束然后单击"更改"按钮,查看该约束的定义。
2. 在命令中心中输入并执行如下SQL语句:
insert into stock values (302, 'V',100.00, 20)
输出结果返回SQL0545,该错误代码表明因为插入的数据不满足检查约束inst1.stock.cctype,所以要请求的操作不被允许。
3. 在命令中心中输入并执行如下SQL语句:
insert into stock values (302, 'C',100.00, 20)
因为'C'满足检查约束cctype,所以该SQL语句成功执行。
第八部分:理解触发器的强制执行
1. 回顾上节实验中在表stock的QTY列上创建的触发器reorder。选择命令中心的"脚本"标签页,然后输入并执行下列SQL语句:
select substr(text,1,200) from syscat.triggers where tabname='stock'
2. 在命令中心中输入并执行下列SQL语句来修改stock表中itemno等于302的元组的qty字段值:
update stock set qty=3 where item=302
注意执行该语句后没有消息显示触发器是否被触发。
3. 查看reorder表,检查在更新stock表qty列后触发器reorder是否被触发。在命令中心
中输入:
terminate
connect to musicdb
select * from reorder
4. 上节实验为表reorder建立了别名emptystock,在命令中心中输入并执行下列SQL语句:
select * from emptystock
输出结果表明对别名emptystock执行的查询操作会直接转化成对reorder表的操作。

步骤五:数据库恢复
实验目的和要求:
A. 为数据库和表空间创建备份镜像;
B. 从备份镜像恢复数据库;
C. 对数据库或表空间进行完全的前滚恢复;
D. 在异常状态下重新激活数据库。
第一部分:决定DB2目前的日志配置参数
1. 本实验开始之前应先在命令中心中执行脚本recovrst,将数据库的配置参数设置成本实验所需的值。
2. 在命令中心中输入并执行connect to musicdb,激活MUSICDB数据库。
3. 控制中心中右键单击MUSICDB数据库,在弹出菜单中选择"配置参数",再在"数据库配置-MUSICDB"窗口中查看"日志"下的LOGFILSIZ的值,该参数的值被设置为6,远小于 Windows平台下它的默认值250。
4. 查看主日志文件的数目,DB2将于什么时候分配这些主日志文件?
在" 数据库配置-MUSICDB"窗口中的"日志"下可查看到LOGPRIMARY参数值为3,当我们发出ACTIVE DATABASE命令或者第一个应用程序连接到数据库时,DB2将会分配这三个主日志文件,且其中每个日志文件的大小为LOGFILSIZ+2个4KB 页,因此所有主日志文件将占据3*(6+2)*4KB,即96KB空间。
5. 查看辅助日志文件的数目,DB2将于何时分配这些辅助日志文件?[问题1]
[辅助日志文件会在事务未提交但主日志文件写满的时候根据需要一次分配一个(直到数据库配置参数LOGSECOND规定的数目),本实验中LOGSECOND为默认值2,因此系统最多允许两个辅助日志文件。辅助日志文件的大小同样由参数LOGFILSIZ指定]。
6. 查看当前系统所使用的日志类型(循环日志还是归档日志),哪些参数可以提供日志类型的相关信息?[问题2]
[LOGRETAIN和USEREXIT可被用来设置系统采用何种日志类型,本实验中这两个参数均被设为默认值否,因此系统采用循环日志方式。如果LOGRETAIN被设为Recovery或者USEREXIT被设为Yes,那么系统将采用归档日志方式]。
7. 考虑循环日志能够支持崩溃恢复、版本恢复、前滚恢复中的哪些类型?[问题3]
[循环日志只能支持崩溃恢复和版本恢复,但还不能支持前滚恢复]。
8. 考虑日志文件保存在哪里?[问题4]
[配置参数中的LOGPATH指定日志文件的保存路径,因此本实验的日志文件保存在X:/INST1/NODE0000/SQL00001/SQLOGIR下]。
9. 数据库的工作单元可能被意外地中断,假如部分工作单元的所有变更完成和提交之前发生了电源故障,那么系统就需要执行崩溃恢复再次回到一致状态。命令 restart database可以实现这个功能。如果AUTORESTART被设置成开(默认方式),那么崩溃发生后,应用程序首次连接到数据库时将会自动启动崩溃恢 复机制。本实验AUTORESTART参数被设置为开。
10. Windows命令提示符下,进入目录X:/INST1/NODE0000/SQL00001。
11. 输入命令:dir /w,查看该路径下有哪些文件和目录。
12. 输入命令cd SQLOGDIR和dir /w可以查看到该目录下有三个日志文件,这与参数设置相符。
13. 选择命令中心的"交互式"标签页,再选择"命令中心->选项"菜单,在"命令中心选项"窗口中选择"执行"标签页,确保"自动落实SQL语句"未被选中。点击"确定"按钮。
执行connect to musicdb
执行update stock set qty=qty+1
14. 如果上步执行后系统显示错误则跳到下一步,如果没有显示错误信息,则继续执行:
update stock set qty=qty-1,这时系统会返回SQL0964C。
15. 为查看详细的错误信息,输入并执行 ?[问题5] [SQL0964。回答为什么更新操作会失败]。
16. 选择命令中心的"交互式"标签页,再选择"命令中心->选项"菜单,在"命令中心选项"窗口中选?quot;执行"标签页,选中"自动落实SQL语句",点击"确定"按钮。
17. 本实验中日志文件故意被设置得很小,所以上面的更新操作未能成功完成,在命令中心中输入并执行如下命令rollback
18. 进入日志保存目录,查看该目录下的文件有几个?[问题6]
[cd X:/INST1/NODE0000/SQL00001/SQLOGIR
dir /w
可查看到该目录下现在多了两个文件,当采用循环日志且主日志文件已满时,DB2就会分配这两个多出来的文件作为辅助日志文件。
输入cd / ,进入根目录下。]
第二部分:循环日志条件下的数据库恢复
1. 在Windows命令提示符下输入md /restore 在X驱动器下建立一个目录用来保存数据库备份。
2. 试图对MUSICDB数据库进行联机备份。
在控制中心中右键单击MUSICDB数据库,在弹出菜单中选择"备份"。
在"备份向导"窗口中,选择"映象"标签页,选择"介质类型"为文件系统,点击"添加"按钮,路径一栏输入x:/restore
点击向导的"选项"标签页,这时注意"可用性"下的"联机"选项为灰色不可选,只能进行脱机备份。
3. 对MUSICDB数据库进行脱机备份,
在上步的"备份向导"窗口中"选项"标签页中选择可用性为"脱机",不要选中"在启动脱机操作之前停顿数据库"选项;
点击备份向导的"调度"标签页,选择"立即运行而不保存历史任?quot;,然后点击"完成"按钮。
4. 系统返回SQL01035表明备份失败,根据提示消息可知目前正有另一个程序在连接并使用要脱机备份的数据库,点击"DB2 消息"窗口的"关闭"按钮。
5. 为了确保所要备份的数据库的完整性,脱机备份要求独占该数据库。因为刚才我们通过命令中心连接到数据库且该连接一直保持到现在,所以脱机备份不能成功。在命令中心中输入如下命令强制所有用户或应用程序切断与该数据库的连接:
force application all
terminate
6. 按照第三步重新脱机备份数据库MUSICDB,这次备份成功。
7. 记录这次备份的时间截。
在控制中心中选?quot;工具->日志"菜单,在"日志"窗口中选择"数据库历史"标签页,点击"数据库"一栏右边的"…"省略号按钮,选择相应的系统名、实例名、数据库名,然后点击"确定"按钮;
按"开始日期"排序MUSICDB所有事件列表,那么本次备份应在列表最上端,记录下该备份的开始日期及时间;
关闭"日志"窗口,然后回到控制中心来。
8. 如果要使用restore命令而不是控制中心来恢复数据库,且备份目录下存在数据库的多个备份镜象,那么,为了指定用哪一份(何时产生的)备份文件,备份的时间截信息就是必须的。
如果使用磁盘备份数据库,那么备份镜象的文件名就包含着时间截信息,如果使用磁带或者Tivoli Storage Manager管理的设备作为备份的存储介质,那么备份镜像的头部也包含着相关的时间信息。
9. 另外一种查看备份相关信息的方法是使用list backup命令,回顾上节实验我们使用load工具之前也备份了数据库MUSICD。命令中心中输入如下命令:
terminate ;
list backup all for musicdb ;
10. 查看上步命令的输出列表,注意所有的时间截及表空间信息。
11. 在list backup命令中可以不使用ALL 关键字,可以指定一个特定的时间截或对象名来限制输出结果,例如要查看某时间以后对MUSICDB进行的所有备份,可以输入:
12. list backup since yyyymmddhh for MUSICDB
13. 数据库管理器所维护的有关备份的历史信息如果从不删除会变得非常多,通过prune history命令可以整理那些备份的相关信息。命令行处理器或命令中心中输入命令查看的prune的在线帮助信息:? Prune
14. 在Windows命令提示符下输入如下命令,可以发现备份的目录结构及文件名与备份的数据库名、实例名、时间截之间的对应关系:
x:
cd restore
dir
cd MUSICDB.0
dir
cd INST1
dir
cd NODE0000
dir
cd CATN0000
dir
cd yyyymmdd
dir
可见备份文件名的格式都为"hhmmss.001"。
15. 本实验中数据库MUSICDB备份后其中数据还未经过任何改动,现在的数据与备份中的数据完全相同。首先执行下面SQL语句选择出编号为77的艺术家的名字和他的专辑名:
select name, title from artists a, albums b where a.artno =77 and a.artno= b.artno;
16. 将编号为77的艺术家的名字改为"Melanie and the Mechanics",并且将编号为261的专辑名改为"Unmaterial Girl":
update artists set name='Melanie and the Mechanics' where artno=77;
update albums set title ='Unmaterial Girl' where itemno=261;
17. 执行下列连接查询查看上步的修改结果:
select name, title from artists a, albums b where a.artno =77 and a.artno= b.artno;
可见这次的输出与前面的查询结果不同
18. 假如现在MUSICDB所在的磁盘出现故障,我们将使用刚刚创建的备份镜像对MUSICDB进行恢复。输入"?restore"命令获得恢复命令的帮助信息。
19. 恢复前为确保当前没有用户或应用程序连接到MUSICDB数据库,命令中心中输入并执行如下命令:
force application all;
terminate;
20. 从X:/restore目录下读取备份文件对MUSICDB进行恢复。
在控制中心中右键单击MUSICDB数据库,在弹出菜单中选择"复原";
选?quot;复原数据向导"窗口的"介绍"页面,选择"复原到现有数据库";
选择向导的"复原对象"页面,选择"复原整个数据库";
选择向导的"可用的映象"页面,选择刚刚备份的映象,然后点击">"按钮;
选择向导的"调度"页面,选择"立即运行而不保存历史任务";
选择向导的"总结"页面,点击"显示命令"按钮查看全部restore命令;
点击向导的"完成"按钮,等待一段时间后系统弹出"DB2 消息"窗口显示命令成功完成,点击"确定"按钮关闭该消息窗口。
21. 重新连接到数据库,输入并执行下列连接查询语句:
connect to MUSICDB;
select name, title from artists a, albums b where a.artno =77 and a.artno= b.artno;
可见这次查询的输出结果反映的是更新前的原数据,所以恢复操作成功完成。
22. 上面的恢复操作虽然复原了更新前的数据,但是因为DB2使用了循环日志方式,无法前滚,所以无法救回备份后对数据库所作的更新。
第三部分:归档日志条件下的数据库恢复
在Windows命令提示符下输入如下命令创建数据库的备份目录(X:/RESTORE):
MD /RESTORE
更改数据库配置文件以采用归档日志方式。
在命令中心中输入并执行下列命令:
update db cfg for musicdb using logretain recovery
第四部分:重新设置实验环境
完成下列任务以确保剩余实验的环境设置正确:
在命令中心中导入并执行X:/cf23/clrec脚本。
检查数据库配置文件,确保目前数据库采用循环日志方式。
命令中心中输入并执行下列语句:
connect to musicdb
get db cfg for musicdb
可见输出结果中"恢复状态的日志保留"为NO。

步骤六:DB2锁
实验目的和要求:
A. 使用系统监视器来分析发生在数据库中的锁定;
B. 区别死锁和锁定超时;
C. 更新那些与锁定超时和死锁相关的数据库配置参数。
第一部分:基本的锁监控
1. 使用Windows控制面板中的用户管理程序按下列要求创建一个新用户,:
用户名:user1
密码:user1
全名:USER1
描述:DB2 User
2. 在命令中心中输入如下命令确保没有应用程序或用户连接到INST1实例:
force application all;
terminate;
3. 将stock表的更新权限授予user1用户:
connect to musicdb;
grant update on stock to user1;
4. 在命令中心中输入并执行下列命令检查当前数据库监视器开关的设置:
get monitor switches
5. 查看输出列表中每个开关的设置,可见除了时间截记被默认打开外其他所有开关都被关
闭。
6. 打开DB2命令窗口,并且将窗口标题改为user1。
选择"开始菜单->程序->IBM DB2->命令行工具->命令窗口";
在窗口中输入并执行title user1。
7. 在上步的DB2命令窗口中输入下面指令,以用户user1连接到MUSICDB:
db2 connect to musicdb user user1 using user1
8. 在用户user1的会话中输入并执行下面语句更新stock表中一行,注意命令中使用了+C
选项以关闭自动提交:
db2 +c update inst1.stock set qty = qty - 1 where itemno =200 and type = ' D'
9. 在控制中心的对象树中右键单击"实例"下的INST1,在弹出菜单中选择"应用程序","应用程序"窗口将显示目前所有连接到该实例的应用程序信息,记录这些程序的"应用程序句柄"值,这些值在本实验的后面部分会非常有用。
INST1 Application Handle = __________
USER1 Application Handle = __________
记下这些值后关闭该窗口。
10. 在命令中心中输入并执行下面命令获得MUSICDB数据库锁快照:

get snapshot for locks on musicdb
检查输出结果,当前数据库中是否有锁定发生?[问题1]
11. 通过上述命令的输出结果查看目前有那些应用程序连接到MUSICDB?[问题2][至少有两个应用程序连接到musicdb,其中一个代理进程与user1会话相关,另一个代理进程与命令中心会话相关]。
12. 目前有哪些代理进程保持锁定?这些代理进程与哪些应用程序相关?[问题3]
(只有一个代理进程保持锁定,该代理进程与user1会话相关。锁快照的输出结果不仅包含每一个连接到数据库的应用程序的总揽信息,而且包含这些程序的详细信息。只有user1应用程序的详细信息块显示了锁定信息。)
13. 是否存在这样的情形,用户或应用程序不用锁定某表就能得到该表的数据行上的锁?[问题4]
14. 当数据行被加锁时,该行所在的表会存在哪几种模式的锁?[问题5][IX﹑IS﹑SIX]
15. 查看这些代理进程锁定了几个不同的表?[问题6]
注意可能在前面步骤的执行结果中出现某些内部P锁,当执行程序包中的SQL语句时(不管是静态的还是动态语句),都会对该包加上这样的锁以防止程序包被删除。
注意锁名称是一个起标识作用的内部二进制串,锁属性和发行版标志也都是二进制串。
16. DB2可能出现系统编目表被锁定的情况,为什么会访问这些编目表?为何要锁定这些表?
第二部分:锁定超时
1. 命令中心中输入并执行如下SQL语句:
connect to musicdb;
select * from stock where itemno = 198 ;
2. 上述语句执行后会得到什么结果?为什么会得到这样的结果?(注意到现在itemno为200的行已被user1应用程序锁定)[问题7]
[执 行结果返回三行数据,尽管user1应用程序对stock表和表上的数据行加了锁,但是上步语句执行时并没有引起争用。虽然该语句需要对stock表加 IS锁并对表上的行加S锁,但这些行与user1应用程序锁定的行并不相同,所以没有出现争用。由此可见IS锁与IX锁的兼容性。]
3. 在命令中心中输入并执行下面SQL语句:
select * from stock where itemno=200
4. 上述语句执行后会有什么输出结果?为什么会有这样的结果?(注意到itemno为200的数据行被user1应用程序锁定)[问题8]
[这时上步执行的查询并不能够完成,这是因为它要对user1程序用X锁锁定的数据行加S锁。]
5. 锁定表引起争用问题了吗?[问题9]
6. 到现在为止我们还没有对实验环境做任何设置以改变命令行处理器的隔离级别。考虑命令中心默认的隔离级别是什么?(是Uncommitted Read还是Cursor Stability)[问题10]
[上面与inst1会话相关的SQL语句执行结果表明默认的隔离级别为Cursor Stablity。因为假如默认的隔离级别为Uncommitted Read的话,那么刚才的查询操作将会执行成功。]
7. 从user1会话输入并执行下面命令来释放行锁:
db2 rollback
8. 刚才等待执行的inst1应用程序是否继续执行?[问题11]
[Inst1 的应用程序继续执行并返回stock表中的数据行。上步的rollback语句解除了user1会话对itemno等于200的数据行上所加的互斥锁,该 互斥锁使得inst1的应用程序无法执行。该锁解除后inst1应用程序对将要读取的数据行加共享锁,查询操作得以执行。]
9. 在命令中心中输入并执行下面的语句查看与锁定超时相关的数据库配置参数:
o get db cfg for musicdb
10. 查看参数LOCKTIMEOUT的值。该参数的默认值为-1,在这种设定下,当程序B在等待一个无法取得的锁定时,锁定等待的情况会一直持续到取得锁定(程序A释放掉X锁定)为止。如果程序A的事务一直没有结束,程序B就会一直等待下去。
11. 在命令中心中输入并执行下面命令将locktimeout参数设为90秒,并且将监视器的锁信息开关和工作单元信息开关打开:
terminate;
force application all;
update db cfg for musicdb using locktimeout 90;
update monitor switches using lock on uow on;
get monitor switches;
connect to musicdb;
12. 打开锁信息开关更新监视器后,什么将会发生?[问题12]
[ 开关打开后就能获得更多的详细信息,在这种情况下我们就能利用某些更加精细的详细信息来分析锁定超时和死锁。]
13. 现在假如inst1用户需要RR的隔离级别,在命令中心中输入下列命令,看是否能成功执行:
terminate;
change sqlisl to RR;
connect to musicdb
14. 在user1会话中,输入并执行下列语句:
db2 terminate
db2 connect to musicdb user user1 using user1
15. 在命令中心会话中,执行下列操作:
o 选择"命令中心->选项"菜单;
o 选择"命令中心选项"窗口的""标签页,点击"自动落实SQL语句"前的勾号以确保该选项不被选中;
o 选择"结果"标签页,确保"在结果页上自动显示查询结果"选项不被选中,然后点击"确定"按钮;
16. 输入并执行下面SQL语句:
select * from stock where itemno=200
17. 从同一命令中心会话中输入下列语句得到MUSICDB的锁快照,说出INST1的应用程序在stock表上的行锁有多少个?[问题13]
get snapshot for locks on musicdb
下面两步在将在锁定超时90秒之前得到数据库的锁快照。
18. 在User1会话中输入并执行下面SQL语句:
o db2 +c update inst1.stock set qty = qty+1 where itemno = 200
19. 上述语句将会因为等待锁而不能执行完成,为了检查这种情况,在命令中心会话中输入并执行下列语句以得到musicdb的另一快照:
o get snapshot for locks on musicdb
20. 分析所得快照中与user1应用程序相关的部分,想想是什么对象引起了争用。
o 从快照收集来的信息表明行锁引起了争用。Inst1的可重复读(repeatable read)应用程序对itemno为200的数据行加上S锁,而user1应用程序要对这些数据行加X锁,而X锁与S锁不兼容。
o 注意快照中关于user1应用程序的面向文本的信息同时标明了正在竞争的程序和所竞争的对象,这些详细信息只有在锁监视器开关打开的情况下才能获得。
21. user1应用程序无法执行下去会等待一段时间,之后会返回SQLCODE-911和原因代码68,这表明等待锁超过了locktimeout设定的时间。
22. 命令中心会话中输入并执行命令rollback回滚刚才的事务以释放共享锁。
23. 回滚user1会话试图进行的更新操作是必须的吗?为什么?
o 因为锁定超时会自动引起事务回滚,所以显式的回滚不是必须的。
第三部分:死锁
1. 确保工作单元监视器开关打开:
o get monitor switches
o update monitor switches using uow on
o get monitor switches
2. 在命令中心中输入并执行下面命令检查当前数据库的DLCHKTIME参数,该参数为检查死锁的时间间隔配置参数:
o get db cfg for musicdb
o 该参数被设为10000,因为是以毫秒为单位,所以该值被转化为10秒。
3. 按照下面要求输入并执行下面一系列SQL语句,要特别注意是在哪个会话中执行SQL语句以及执行这些语句的顺序。对于步骤c和步骤d,首先输入步骤c的命 令但先不要执行,再输入步骤d的命令但也不要执行,然后回到步骤c的命令窗口执行步骤c的命令,之后再在步骤d的窗口中按回车键执行d的语句。这样的顺序 能够保证所设置的锁定超时参数不会影响实验意图。注意inst1会话为命令中心,并且命令中心关掉了自动落实功能:
inst1=> select * from stock where itemno=100
user1=> db2 +c update inst1.stock set qty=qty+1 where itemno=200
inst1=> select * from stock where itemno=200
user1=> db2 +c update inst1.stock set qty=qty+1 where itemno=100

4. 这时会观察到什么?为什么会出现这样的情况?[问题14]
5. 在命令中心中输入下面的语句获得目前数据库的应用程序快照:
get snapshot for applications on musicdb
注意每个应用程序的UOW完成状态。
6. Inst1会话的应用程序状态是什么?为什么会是这样的状态?[问题15]
Inst1的应用程序状态为空,这是因为它的事务还没有完成。
7. user1会话的应用程序状态是什么?为什么会是这样的状态?[问题16]
8. 命令中心中输入并执行rollback释放它所持有的锁。
9. 按要求输入并执行下面一系列SQL语句
- inst1=> select * from stock where item =100
- user1=> db2 +c update inst1.stock set qty=qty+1 where itemno=200
- inst1=> select * from stock where item=200
10. 等待数据库管理器采取某些措施,数据库管理器采取了什么措施?为什么会采取这样的措施?[问题

17][User1会话下输入并执行下面语句回滚所做的修改:
db2 rollback]
第四部分:为完成后面的实验重新设置系统

1. 在命令中心中选择"命令中心->选项"菜单;
o 选择"执行"选项卡,选中"自动落实SQL语句"选项以打开自动提交功能;
o 选择"结果"选项卡,选中"在结果页上自动显示查询结果"选项,然后点击"确定"按钮关闭该窗口。
2. 在user1会话中执行下面命令:
o db2 terminate
3. 在命令中心会话中导入并执行LOCRESET脚本来重新设置实验环境。

步骤七:数据库验证
实验目的和要求:
A. 熟悉DB2 UDB中PUBLIC组的默认特权;
B. 学会管理DB2权限(SYSADM,SYSCYRL,SYSMAINT和DBADM),熟悉各种权限的操作能力;
C. 能够对单个用户和组授予特权;
D. 清楚何时组特权可用和何时需要个人特权等。
第一部分:默认的PUBLIC特权
1. 从DB2的控制中心,确定当前数据库的所有用户的默认权限。
从DB2控制中心,选择MUSICDB数据库,右键选择Authorities,然后选择Group标签;
2. 查看具有授权的任一个ID用户可以对MUSICDB进行哪些操作?[问题1]
[这些操作包括创建数据库、添加新的PACKAGES,连接到数据,以及隐式地创建模式等。]
3. NOFENCE列包含一个"not"符号,这表示PUBLIC组不具有创建NOT FENCED用户自定义函数的特权,该工作需要授予某个用户,和创建用户自定义函数相关的另一个命令CREATE EXTERNAL ROUTINE也不缺省地授予PUBLIC的特权。
4. 在LOAD列上也具有"not"符号,表示PUBLIC组不能够进行LOAD操作,只有SYSADM,DBADM,或在数据库上具有LOAD及与LOAD操作相关的其他操作特权的用户,可以进行LOAD操作:
5. 要查看所有的授权信息,可以通过SYSCAT.DBAUTH视图来进行。
6. 建立一个以不同用户连接到数据库MUSICDB的对话。打开DB2命令窗口,输入"title user1"。以user1用户连接到数据MUSICDB
db2 connect to musicdb user user1 using user1
7. 输入下列SQL语句
db2 "select substr(tbspace,1,18) from syscat.tablespaces"
8. 看一下上面的语句是否能够正确执行?为什么?[问题2]
[语句能够正确执行,因为在PUBLIC中,SELECT是默认的特权,自然user1用户也能够执行查询操作。]
9. 输入下列SQL语句,看一下是否能够执行?[问题3]
[db2 "create table test1 (partno integer, subpart integer) in DMS04"
该语句不能够成功执行,因为user1用户在DMS04表空间上没有USE特权。]
10. user1用户要想实现上述操作,可以通过其他用户对其授权实现,假设corp_spy用户具有相应的权限,可以实现对user1用户的授权。在DB2的命令窗口中输入下列命令即可:
title corp_spy
db2 connect to musicdb
db2 grant use of tablespace dms04 to user user1
11. user1用户可以重新输入下列命令来实现上述操作:
db2 "create table test1 (partno integer, subpart integer) in DMS04"
此时,该语句就会成功执行。
12. user1可以通过下列方法可查看MDS04表空间的ID:
在控制中心,在MUSICDB数据库下选择Views,然后选择TABLESPACES视图,并用右键查看其内容,可以看到DMS04的ID为6。
13. 在命令中心,列出表空间DMS04中的所创建的所有表。
在命令中心的交互页面,输入下列命令:
terminate
connect to musicdb
select tabschema, tabname from syscat.tables where tbspaceid = 6
14. 以用户inst1身份,通过GUI将表user1.test1从数据库中删除。这里需要清楚的是,inst1之所以能够删除该表,是因为该用户具有系统管理员权限。
15. 撤销PUBLIC的默认权限。
在控制中心,在MUSICDB数据库的用户和组左侧单击+号,选择DB Group,然后在内容部分选择PUBLIC,右键选择change,然后去掉其连接数据库、创建表、创建包等选项。
16. 再以user1用户创建表test1:
db2 create table test1 (partno integer, subpart integer) in DMS04
由于CREATETAB特权被撤销,所以用户user1不能够再创建该数据表。但是此时user1与数据库的连接仍然处于活动状态。
第二部分:DB2的权限
1. Inst1既是Windows的管理员,又是DB2的系统管理员。用inst1的Windows管理权限创建四个新的用户:usersys,userctl,usermnt和userdba,密码与用户名相同。在DB2的命令窗口,输入下列命令:
net user usersys usersys /add
net user userctl userctl /add
net user usermnt usermnt /add
net user userdba userdba /add
然后输入下列命令:
net localgroup STAFF /add
net localgroup STAFF userdba /add
下面以usersys来作数据库系统管理员。首先通过INST1实例的数据库管理器配置参数,查看一下当前的系统管理员组是否是AMD1。
2. 在DB2命令窗口中输入下列命令,可以查看ADM1组中的用户。
net localgroup ADM1
这些用户具有数据库管理员权限。要是其他用户也要具有该权限,需要将其加入到ADM1组中。
3. 在DB2命令窗口中输入下列命令,将usersys添加到ADM1组中,并可通过net localgroup ADM1命令查看加入usersys用户后ADM1组中用户的变化。
net localgroup ADM1 usersys /add
4. 在DB2命令窗口中输入title usersys。
5. 从usersys对话,可以确认usersys已经具有了相应的权限。
db2 connect to musicdb user usersys using usersys
db2 select name from inst1.artists
db2 grant delete on inst1.artists to public
db2 revoke delete on inst1.artists from public
db2 get snapshot for locks on musicdb |more

虽然在第一部分中的Revoke已经撤销了部分public特权,但这些语句全部能够成功执行,因为数据库系统管理员可以完成任何工作。
6. 作为具有sysadm权限的用户,usersys可以更新数据库管理器配置文件。如:
db2 update dbm cfg using sysctrl_group ctrl1 sysmaint_group maint1
该更改生效,需要执行下列语句:
db2 force application all
db2 terminate
db2stop
db2start
从控制中心,可以查看到更改后配置参数。
7. 在DB2命令窗口,创建一个名为CTRL1的组,并为之添加一个成员userctl,然后创建一个MAINT1组,并添加一个用户usermnt。
net localgroup CTRL1 /add
net localgroup MAINT1 /add
net localgroup CTRL1 userctl /add
net localgroup MAINT1 usermnt /add
8. 通过title命令分别为userctl和usermnt两个标题分别为userct和usermn命令提示窗口。
9. 在userctl的命令窗口中,输入下列语句以查看该用户具有的权限:
db2 connect to musicdb user userctl using userctl
db2 get authorizations
我们会发现该用户具有SYSCTRL权限,即系统控制权限。
10. 在usermntl的命令窗口中,输入下列语句以查看该用户具有的权限:
db2 connect to musicdb user usermnt using usermnt
db2 get authorizations
usermnt用户具有SYSMAINT权限,即系统维护权限。
11. 在userctl的命令窗口中,输入下列语句(此时不要做其他任何授权操作):
db2 create table test1 (col1 char(1))
db2 drop table inst1.reorder
db2 select * from inst1.music
这三个语句均不能够成功执行,都会遇到权限错误。因为SYSCTRL权限不能够访问数据库对象,而SYSMAINT权限是SYSCTRL的子集,对SYSCTRL不能完成的操作,SYSMAINT也不能实现。
12. 在userctl的命令窗口中,执行下列SQL语句:
db2 select name from inst1.artists
该语句会成功执行,因为从表artists中查询数据的特权被授予了PUBLIC,该特权可以通过控制中心,在用户和组的查看。需要清楚,和SYSCTRL权限相关的特权不是对特定表的,而是面向实例的。
13. 在userctl的命令窗口中,为MUSICDB数据库指定一个新的别名:
db2 catalog db musicdb as ctrlsdb
14. 在userctl和usermnt的命令窗口中输入db2 terminate命令。
15. 将userdba添加为数据库管理员。在控制中心,右键点击MUSICDB数据库,选择Authorities,然后单击ADD命令,在用户页面,选择用 户userdba,并为其添加DBADM权限。添加后可以通过控制中心,在DBAUTH视图中查看到该用户的权限。
16. 将userctl的的命令窗口标题改为userdba。
Title userdba
17. 在userdba的命令窗口中,输入下列命令,连接到MUSICDB数据,并执行如下操作
db2 connect to musicdb user userdba using userdba

db2 select name from inst1.artists
db2 create table test1 (col1 char(1))
db2 create table inst1.dlc (col1 char(1))
db2 drop table inst1.dlc
第三部分:DB2用户和组特权
1. 以userdba用户身份,将下列内容插入到inst1.artists表中。
db2 insert into inst1.albums values('DB2 Connect is My Life',99, 310)
db2 insert into inst1.albums values('Rustle Up', 99, 311)
2. 系统维护权限用户usermnt没有SQL特权,从userdba的命令窗口对其授予delete特权:
db2 grant delete on inst1.albums to usermnt
3. 从usermnt的命令窗口,连接到数据库MUSICDB,并执行表inst1.albums的删除行操作:
db2 connect to musicdb user usermnt using usermnt
db2 delete from inst1.albums where itemno = 310
4. 如果上述删除操作被inst1发现,并且inst1通过与授权相似的方式,将userdba的DBADM权限收回。同时,userdba想将删除的内容重新插入:
db2 insert into inst1.albums values('DB2 Connect is My Life',99, 310)
但是该操作是被禁止的,因为userdba不再具有数据库管理权限,不能再对其他用户模式下创建的数据进行操纵。
5. 如果userdba是数据对象的创建者,当被撤销数据库管理权限时,仍可执行如上的操作。如对userdba创建的表test1,仍可进行下列操作:
db2 select * from test1
db2 drop table test1
6. 通过db2 terminate和exit命令分别关闭用户userdba、usermnt、usersys等的对话窗口。
思考问题
见实验内容中标记。部分答案已经在问题后面的方括号中给出。