数据库应用答案第九章

合集下载

数据库系统原理课后答案 第九章

数据库系统原理课后答案 第九章

9.1 名词解释(1)OODBS:是指面向对象数据库系统,它既具数据库管理的基本功能,又能支持面向对象的数据模型。

(2)ORDBS:基于对象关系数据模型的DBS称为对象关系数据库系统(ORDBS)。

(3)平面关系模型:传统的关系模型称为“平面关系模型”,它要求关系模式具有第一范式(1NF)性质,关系具有规范化的结构。

也就是规定属性值是不可分解的,即不允许属性值具有复合结构(元组或关系)。

(4)嵌套关系模型:是从平面关系模型发展而成的。

它允许关系的属性值又可以是一个关系,而且可以出现多次嵌套。

嵌套关系突破了1NF的定义框架,是“非1NF关系”。

(5)复合对象模型:在嵌套关系模型上进一步放宽要求。

在关系定义上,集合与元组不再有交替出现的严格限制,此时的关系中,属性类型可以是基本数据类型、结构类型(元组类型)或集体类型(即关系类型)。

(6)数据的泛化/细化:是对概念之间联系进行抽象的一种方法。

当在较低层上的抽象表达了与之联系的较高层上抽象的特殊情况时,就称较高层上抽象是较低层上抽象的"泛化",而较低层上抽象是较高层上抽象的"细化"。

(7)对象关系模型:在传统关系数据基础上,提供元组、数组、集合等更为丰富的数据类型及处理新数据类型操作的能力而形成的数据模型。

(注:传统关系模型只支持字符、数值、字串,布尔值等等基本数据类型及其处理功能)(8)类型级继承性:当继承性发生在类型级时,子类型继承了超类型的属性。

也就是说,超类型所具有的属性,在子类上也具有。

(9)表级继承性:继承性也可发生在表级,(就是元组集合上发生继承),子表继承超表全部属性,超表中每个元组最多可以与子表中一个元组对应,而子表中的每个元组在超表中恰有一个元组对应,并在继承的属性值上具有相同的值。

(10)引用类型:数据类型可以嵌套定义,在嵌套引用时,不是引用对象本身,而是个用对象标识符(即指针),这种指针被称为引用类型。

数据库原理与应用第九章

数据库原理与应用第九章
2.唯一性约束 唯一性创建的方法通常有两种:SQL语句和SQL Server管
理平台,这里介绍使用SQL Server管理平台的方法。 在SQL Server 2005管理平台中,展开指定的数据表和数
据库,右击要操作的数据表,从弹出的快捷菜单中选择“修改” 命令,打开修改数据表界面,在要设置唯一性的属性上右击, 从弹出的快捷菜单中选择“索引/键”命令,打开“索引/键”对 话框,单击“添加”按钮后对话框将出现新的索引/键名称,用 户可以修改该索引/键的名称并设置“是唯一的”为“是”,完 成唯一约束的设置。
列的为空性决定表中的行是否可为该列包含空值。空值 (或NULL)不同于零(0)、空白或长度为零的字符串(如 "")。NULL的意思是没有输入,出现NULL通常表示值未知或 未定义。
9.2 约束的定义与操作
9.2.2 操作约束
约束的操作主要包括增加、修改和删除约束,其方法通 常有两种,SQL 语句和SQL管理平台。下面介绍使用SQL管 理平台的方法。
| <table_constraint> } [ ,...n]
9.1 数据表的定义与操作
9.1.3 删除数据表
删除数据表可以采用命令和管理平台两种方式删除表。这 里主要介绍使用管理平台删除数据表。
在SQL Server 2005管理平台中,展开指定的数据库和数据 表,右击要删除的数据表,从弹出的快捷菜单中选择“删除” 命令,将打开“删除对象”窗口,单击“确定”按钮即删除数 据表。单击“关系依赖图”按钮,可显示所有该表依赖的对象 以及依赖该对象的对象,当有对象依赖该表时,想删除该表就 必须先删除依赖该表的其他表,否则该表不能被删除。
在SQL Server 2005管理平台中,展开指定的数据表和 数据库,右击要操作的数据表,从弹出的快捷菜单中选择 “修改”命令,打开修改数据表界面,在要修改约束的属性 上右击,从弹出的快捷菜单中选择合适的约束命令,然后按 照创建各约束的步骤在对创建的约束进行增加、修改或删除 即可。

《MySQL数据库原理、设计与应用》第9章课后习题答案

《MySQL数据库原理、设计与应用》第9章课后习题答案

第九章一、填空题1.数据库2.原子3.START TRANSACTION4.AUTOCOMMIT5.READ UNCOMMITTED二、判断题对1.对2.对3.错4.对5.对三、选择题1. C2.B、C、D3. B4. B5. D四、简单题1.请简述什么是事务。

答:在MySQL中,事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,且每个SQL语句是相互依赖的。

只要在程序执行过程中有一条SQL语句执行失败或发生错误,则其他语句都不会执行。

也就是说,事务的执行要么成功,要么就返回到事务开始前的状态,这就保证了同一事务操作的同步性和数据的完整性。

2.请简述什么是事务的ACID特性。

答:①原子性是指一个事务必须被视为一个不可分割的最小工作单元。

②一致性是指在事务处理时,无论执行成功还是失败,都要保证数据库系统处于一致的状态,保证数据库系统从不返回到一个未处理的事务中。

③隔离性是指当一个事务在执行时,不会受到其他事务的影响。

④持久性是指事务一旦提交,其对数据库的修改就是永久性的。

五、实训题1.请利用事务实现在用户下订单时,检查商品库存是否充足。

START TRANSACTION;1# 查询id为1的商品的库存SELECT stock FROM sh_goods WHERE id = 1;# 根据结果回滚或提交COMMIT;2.请利用事务在用户下订单前,检测当前用户是否已被激活,若未激活,则需激活此用户后,才能再次下订单。

START TRANSACTION;# 查询id为1的用户是否激活SELECT is_active FROM sh_user WHERE id = 1;# 根据结果回滚或提交COMMIT;2。

数据库第九章参考答案

数据库第九章参考答案

第九章T-SQL基础P1641.从功能上划分,SQL分为哪4类?[难度↓]【解】SQL语句通常分成以下4类:数据查询语言数据操作语言数据定义语言数据控制语言2.NULL代表什么含义?将其与其他值进行比较会产生什么结果?如果数值型列中存在NULL,会产生什么结果?[难度↓]【解】在数据库中,NULL是一个特殊值,表示数值未知。

NULL不同于空字符或数字0,也不同于零长度字符串。

比较两个空值或将空值与任何其他数值相比均返回未知,这是因为每个空值均为未知。

空值通常表示未知、不可用或以后添加数据。

如果某个列上的空值属性为NULL,表示接受空值;空值属性为NOT NULL,表示拒绝空值。

如果数值型列中存在NULL,则在进行数据统计时就会产生不正确的结果。

3.使用T-SQL语句向表中插入数据应注意什么?[难度↓]【解】在使用T-SQL语句向表中插入数据时要注意以下几点:当向表中所有列都插入新数据时,可以省略列表名,但是必须保证VALUES 后的各数据项位置同表定义时的顺序一致。

要保证表定义时的非空列必须有值,即使这个非空列没有出现在插入语句中,也必须如此。

插入字符型和日期型值时,要加入单引号。

没有列出的数据类型应该具有以下属性之一:identity属性、timestamp 数据类型、具有NULL属性或者有一个默认值。

对于具有identity属性的列,其值由系统给出,用户不必往表中插入数据。

4.在SELECT语句中DISTINCT、ORDER BY、GROUP BY和HA VING子句的功能各是什么?[难度↓]【解】各子句的功能如下。

DISTINCT:查询唯一结果。

ORDER BY:使查询结果有序显示。

GROUP BY:对查询结果进行分组。

HA VING:筛选分组结果。

5.在一个SELECT语句中,当WHERE子句、GROUP BY子句和HA VING子句同时出现在一个查询中时,SQL的执行顺序如何?[难度↓↓]【解】其执行顺序如下:(1)执行WHERE子句,从表中选取行。

[国家开放大学]2020年《数据库应用技术》形考任务3_第9章测验-复习资料答案

[国家开放大学]2020年《数据库应用技术》形考任务3_第9章测验-复习资料答案

[国家开放大学]2020年《数据库应用技术》形考任务3_第9章测验提示:本资料自作参考学习使用一、单项选择题(每题2分,共10分)1.在VB中,可以利用Connection对象的Execute方法实现对数据库的更改操作。

关于删除SC表中学号为S01的选课记录的语句,正确的是( ? ?)。

A.ADOcn.Execute “UPATE FROM SC WHERE 学号 = 'S01'”B.ADOcn.Execute “SELECT FROM SC WHERE 学号 = 'S01'”C.ADOcn.Execute “DROP FROM SC WHERE 学号 = 'S01'”D.ADOcn.Execute “DELETE FROM SC WHERE 学号 = 'S01'”提示:本题为必答题,请认真阅读题目后再作答--本题参考答案:D2.设ADOcn是一个Connection对象,与数据库的连接字符串存放在cnStr字符串中。

关于使用ADOcn建立与数据源连接的语句,正确的是( ? ?)。

A.ADOcn.connetion cnStrB.ADOcn.conn cnStrC.ADOcn.Open cnStrD.ADOcn.Create cnStr提示:本题为必答题,请认真阅读题目后再作答--本题参考答案:C3.不属于VB中ADO对象模型中的对象的是( ?)。

A.UpdateB.RecordsetC.Connectionmand提示:本题为必答题,请认真阅读题目后再作答--本题参考答案:A4.声明并创建Connection对象的语句,正确的是( ? )。

A.Dim ADOcn As New ConnectionB.Dim ADOcn As ConnectionC.Declare ADOcn As New ConnectionD.Declare ADOcn As Connection提示:本题为必答题,请认真阅读题目后再作答--本题参考答案:A5.利用Recordset对象可以得到查询结果集。

第9章课后习题答案

第9章课后习题答案

第9章习题答案1.简要说明数据库设计的步骤。

答:Access中数据库设计一般要经过五个步骤:(1)分析建立数据库的目的(2)确定数据库中需要的表(3)确定表中的字段(4)确定主关键字(5)确定表之间的关系2.Access数据表中主键的作用是什么?(P230- P231)答:Access中主键是由表中的一个或多个字段组成,用来唯一标识表中的某一条记录。

指定主键后,Access将阻止在主键中输入重复值或NULL值。

在一个数据库中多表间建立关系时,必须通过表的主键和外键建立。

3. Access支持的查询类型有什么?(P234)答:Access支持的查询类型有5类:(1)选择查询选择查询是最常见的查询类型,它从一个或多个表中检索数据,在一定的限制条件下,还可以通过选择查询来更改相关表中的记录。

使用选择查询也可以对记录进行分组,并且可对记录进行总计、计数以及求平均值等其他类型的计算。

(2)交叉表查询交叉表查询能够汇总数据字段的内容,汇总计算的结果显示在行与列交叉的单元格中。

交叉表查询可以计算平均值、总计、最大值、最小值等。

(3)参数查询参数查询会在执行时弹出对话框,提示用户输入必要的信息(参数),然后按照这些信息进行查询。

(4)操作查询操作查询是在一个操作中更改许多记录的查询,操作查询又可分为四种类型:删除查询、更新查询、追加查询和生成表查询。

(5)SQL查询SQL查询是使用SQL语句创建的查询,包括联合查询、传递查询、数据定义查询和子查询。

4.简述数据库中视图、查询与SQL语言的区别。

答:视图..是一种虚拟的表,为了简化复杂查询语句的书写,另外也提高了数据库一定的安全性。

查询..是利用SQL语句或创建查询的方式根据一定的条件进行检索,筛选出符合条件的记录,构成一个新的数据集合,方便对数据库进行查看和分析。

SQL..是一种结构化的查询语言,利用SQL语言可以对数据库...语言中数据进行定义、查询、更新等操作。

数据库系统原理教程课后习题及答案(第九章)

数据库系统原理教程课后习题及答案(第九章)

第9章数据库恢复技术1.试述事务的概念及事务的4 个特性。

答:事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。

事务具有4 个特性:原子性(Atomicity )、一致性(consistency )、隔离性( Isolation )和持续性(Durability )。

这4 个特性也简称为ACID 特性。

原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

隔离性:一个事务的执行不能被其他事务干扰。

即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

持续性:持续性也称永久性(Perfnanence ) ,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

接下来的其他操作或故障不应该对其执行结果有任何影响。

2 .为什么事务非正常结束时会影响数据库数据的正确性,请列举一例说明之。

答:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。

例如某工厂的库存管理系统中,要把数量为Q 的某种零件从仓库1 移到仓库2 存放。

则可以定义一个事务T , T 包括两个操作;Ql = Ql 一Q , Q2= Q2 + Q。

如果T 非正常终止时只做了第一个操作,则数据库就处于不一致性状态,库存量无缘无故少了Q 。

3 .数据库中为什么要有恢复子系统?它的功能是什么?答:因为计算机系统中硬件的故障、软件的错误、操作员的失误以及恶意的破坏是不可避免的,这些故障轻则造成运行事务非正常中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中全部或部分数据丢失,因此必须要有恢复子系统。

《数据库技术与应用》第9章 并发控制 习题答案

《数据库技术与应用》第9章 并发控制 习题答案

第9章并发控制1. 试述DBMS中采用并发控制的目的。

解:并发控制是以事务为单位进行的。

DBMS中的并发控制的目的是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。

2. 试述共享锁和排他锁的含义。

解:排它锁又称为写锁。

排他锁是最严格的一类封锁,当需要对表进行插入、删除或更新操作时,应该使用排他锁。

当一个事务对某数据加上排他锁后,其他事务不得对该数据对象施加任何封锁。

共享锁又称为读锁。

当一个事务队某数据对象加上共享锁后,其他事务可以读取该数据,不能对该数据对象做任何修改。

共享锁可以保证最大的并发性,任何数量的用户可以同时对相同的数据施加共享锁。

3. 试述死锁是如何产生的,列举一些常见的预防死锁的方法。

解:产生死锁的原因是两个或多个事务都锁定了一些数据库对象,然后又都需要锁定对方的数据库对象失败而需要等待所造成的。

预防死锁通常有两种方法:一次封锁法和顺序封锁法。

一次封锁法要求每个事务一次就将要操作的数据库对象全部锁定,否则就不继续执行。

该方法会降低系统的并发度。

顺序封锁法要求预先对数据库对象规定一个封锁顺序,所有事务都按这个顺序来实行封锁。

该方法算法复杂,成本高。

4. 简述数据库系统中经常用到检测和解除死锁的方法。

解:数据库系统中检测死锁一般使用超时法或事务等待图法。

数据库管理系统一般采用如下方法来解除死锁:在循环等待的事务中,选择一个事务作为牺牲者,给其他事务“让路”。

回滚牺牲的事务,释放其获得的锁及其他资源。

将释放的锁让给等待它的事务。

5. 简述多粒度封锁的含义以及优点。

解:同时支持多种锁定粒度供事务选择的封锁方法叫做多粒度封锁。

其中,封锁对象可以是数据库、表、记录、列、索引等的逻辑单元,也可以是数据页或索引页、块等的物理单元。

采用多种粒度封锁能够提高并发度和减少锁的数量。

6. 试述意向锁的含义,简要介绍几种常见的意向锁。

解:意向锁的含义是,如果对一个节点加某种意向锁,则会对该节点的各级下级节点加这种锁;如果对一个节点加某种锁,则必须先对该节点的各级上级节点加这种意向锁。

《数据库管理系统应用》第九章课后习题答案

《数据库管理系统应用》第九章课后习题答案

第九章模块与VBA程序设计课后习题答案(P324)一、选择题:1~5. AADCA 6~10.CBDBA 11~15. BDDBB16~20. CADBC 21~26. DDDACD二、填空题:1. Visual Basic for Applications2. Sub;Function3. Dim4. 局部变量;模块变量;全局变量5. Dim或Private ;Public6. Static7. Type…End Type8. 选择结构;循环结构9. IIF();Switch();Choose() 10. 判定输入的数据是否为日期型数据11. Byval;传址调用12. On Error 13. 用于关闭错误处理14. 系统忽略错误,且继续处理随后的指令15. 用于接收用户从键盘输入的内容;MsgBox16. #或Double 17. 条件18. -1;019. Int(61*rnd()+15) 20. 计时器触发或Timer 21. OpenForm 22. 事件过程23. 计时器间隔或TimerInterval 24. MsgBox;False 25. Me.TimerInterval=0;close;i 26. MsgBox “数据处理结束!”,,”消息”27. X>=7 28. 5 29. 12 30. 9 31. 及格32. num;i 33. X=s;s=”0001”;Dim mc as New MyClass34. DAO;ADO 35. DBEngine36. CurrentDb();CurrentProject.Connection37. WorkSpace;Database;Field 38. Connection;RecordSet;Field;Command 39. Eof;StrSQL 40. Null或空值;从指定的记录集中检索特定字段的值- 1 -。

数据库第9章习题参考答案

数据库第9章习题参考答案

第9章习题解答1.选择题(1)以下是合法的变量名。

A.4p B.姓名C."年龄" D.IfNot(2)InputBox函数的返回值类型是。

A.变体型 B. 整型C.实型D.字符型(3)在VB中,下面正确的逻辑表达式是。

A.x>y AND y>z B.x>y>z C.x>y AND >z D.x>y &y>z (4)在窗体上画一个名称为Commandl的命令按钮,然后编写如下程序:Private Sub Command1_Click()Static X As IntegerStatic Y As IntegerClsY=1Y=Y+5X=5+XPrint X,YEnd Sub程序运行时,3次单击命令按钮Commandl后,窗体上显示的结果为。

A.15 16 B.15 6 C.15 15 D.5 6(5)表达式3^2*2+3 MOD 10\4的值是。

A.18 B.1 C.19 D.0(6)在窗体上画一个水平滚动条,名称为HScroll1;再画一个文本框,名称为Text1。

要想使用滚动条滑块的变化量来调用文本框中文字的大小,则可满足的语句是。

A.Text1.FontName= HScroll1.Max B.Text1.FontSize= HScroll1.MinC.Text1.FontSize= HScroll1.value D.Text1.FontBold= HScroll1.value (7)以下不是图片框PictureBox的方法。

A.cls B.print C.pset D.ScaleMod(8)数据访问接口ADO是Microsoft处理数据库信息的新技术,以下关于ADO技术的叙述不正确的是。

A.ADO是一种ActiveX对象B.ADO采用了OLE DB的数据访问模式C.ADO是数据访问对象DAO、远程数据对象RDO和开放数据库互连ODBC三种方式的扩展D.ADO Data控件不能创建与数据库的连接(9)在Visual Basic中,ADO数据控件不能直接显示记录集中的数据,必须通过数据绑定控件来实现,下列控件不能与ADO数据控件实现绑定。

数据库原理及应用(SQL Server 2008)第9章答案

数据库原理及应用(SQL Server 2008)第9章答案

9.6.1 选择题A C C B9.6.2 填空题1、Windows身份验证模式混合验证模式。

2、端点SQL Server登录名数据库3、IMPERSONATE9.6.2 简答题1、简述Windows身份验证模式和混合验证模式的区别。

在Windows身份验证模式中,用户通过Microsoft Windows用户帐户连接时,SQL Server 使用Windows操作系统中的信息验证帐户名和密码。

在混合模式中,当客户端连接到服务器时,既可能采取Windows身份验证,也可能采取SQL Server身份验证。

当设置为混合模式时,允许用户使用Windows身份验证和SQL Server身份验证进行连接。

Windows身份验证模式是默认的身份验证模式,它比混合模式安全。

Windows身份验证模式使用Kerberos安全协议,通过强密码的复杂性验证提供密码策略强制、帐户锁定支持、支持密码过期等。

通过Windows用户帐户连接的用户可以使用Windows验证的受信任连接。

如果必须选择"混合模式"并要求使用SQL Server帐户登录,则必须为所有的SQL Server帐户设置强密码。

2、在Microsoft SQL Server 2008 R2系统中,针对所有对象的权限有哪些?针对所有对象的权限有CONTROL、ALTER、ALTER ANY、TAKE OWNERSHIP、INPERSONATE、CREATE及VIEW DEFINITION等。

3、ALTER ANY权限与ALTER权限有哪些差别?ALTER权限为被授权者授予更改特定安全对象的属性的权限,实际上这些权限可以包括该对象除所有权之外的权限。

实际上,当授予对某个范围内的ALTER权限时,也授予了更改、删除或创建该范围内包含的任何安全对象的权限。

ALTER ANY权限与ALTER权限是不同的。

ALTER权限需要指定具体的安全对象,但是ALTER ANY权限则是与特定安全对象类型相关的权限,不针对某个具体的安全对象。

数据库原理与应用第9章答案解析主编肖海蓉、任民宏

数据库原理与应用第9章答案解析主编肖海蓉、任民宏

数据库原理与应用第9章答案解析主编肖海蓉、任民宏第9章数据库的备份与恢复9.1数据库的备份9.1.1备份的相关概念9.1.2SQLServer2012数据备份方式9.1.3SQLServer2012备份设备的管理9.1.4SQLServer2012数据库备份9.2数据库的恢复9.2.1SQLServer2012数据恢复模型9.2.2SQLServer2012数据库恢复9.2.3SQLServer2012数据库的分离和附加9.3数据的转换9.3.1SQLServer2012数据导出9.3.2SQLServer2012数据导入本章小结习题9第9 章数据库的备份与恢复课后习题参考答案1、简答题(1)简述SQL Server 2012 数据备份方式,并说明它们之间的区别。

答:SQL Server 2012 中把数据备份分为数据库备份、文件及文件组备份两大类。

①数据库备份分为完整备份、差异备份、事务日志备份。

其中完整备份是将整个数据库的所有数据及数据库对象完全复制到备份文件中;增量备份也称为差异备份,是完整备份的补充;这种备份方式须首先执行过一次完整备份,之后每次增量备份仅是备份最近一次完全备份以后数据库发生变化的数据;事务日志备份即备份发生在数据库上的事务,只备份事务日志中的内容。

完整备份比较容易理解,即备份一个完整数据库的当前所有内容,日志备份和增量备份都是在数据库完整备份的基础上备份后期数据库变动更新的内容,二者的区别是各自备份的起点不同。

②文件与文件组备份;若在创建数据库时建立了多个数据库文件或文件组,则可以使用文件和文件组备份方式。

一般可以将数据库文件组和文件存储在不同的备份设备上,通常应用于经常更新的超大型数据库或分布在多个文件的数据库,是比较复杂的备份。

(2)简述如何创建备份设备。

答:备份设备可以通过SQL Server Management Studio 或T-SQL 语言来实现。

1)使用SQL Server Management Studio 创建备份设备;①在对象资源管理器中,展开“服务器名称”→“服务器对象”→“备份设备”节点,右击“备份设备”节点,出现备份设备快捷菜单。

第9章习题参考答案

第9章习题参考答案

第9章习题参考答案9.1 答案(1)事务是构成数据库应用中一个独立逻辑工作单元的操作的集合,也是访问并可能更新数据库中各种数据项的一个程序执行单元。

(2)定义在多个事务上的调度是这些事务的所有操作的一个执行序列,代表了这些操作的执行顺序。

(3)事务T i的操作I i与事务T j的操作I j是冲突的,当且仅当I i和I j访问数据库中同一个数据项Q,并且I i和I j中至少有一个是写操作write(Q)。

(4)如果一个并发调度冲突等价于某个串行调度,则称该并发调度是冲突可串行的。

(5)死锁是指数据库系统中部分或全部事务由于无法获得对需要访问的数据项的控制权而处于等待状态,并且将一直等待下去的一种系统状态。

9.2 答案原子性指事务对数据库的所有操作是一个不可分割的工作单元。

这些操作要么全部执行,要么一个也不执行。

一致性指当事务独立执行时,其执行结果应维护数据库的一致性,即数据库不会因事务执行而遭受破坏。

事务应使数据库从一个一致性状态转到另外一个一致性状态。

隔离性指当多个事务并发执行时,系统应保证一个事务的执行结果不受其它事务的干扰,事务并发执行结果与这些事务串行执行时的结果是一样的。

持久性指一个事务一旦成功完成全部操作,则它对数据库的所有更新就永久地反映在数据库中。

即使以后系统发生了故障。

9.3题目:简述1级,2级,3级加锁协议的基本原则答案:1级加锁协议要求事务T在修改数据项Q之前必须先对Q加X锁,直到事务结束才释放该锁。

事务结束包括正常结束(commit)和非正常结束(rollback)。

但事务如果只是读Q而不对其进行修改,是不需要对Q加锁的。

2级加锁协议是在1级加锁协议基础上,要求事务T在读取数据项Q之前必须先对其加S 锁,读完Q后可以立即释放S锁。

3级加锁协议则是在1级加锁协议基础上,要求事务T在读取数据项Q之前必须先对其加S锁,但是需要等到事务结束时才释放该S锁。

9.4 答案2阶段锁协议将每个事务的执行过程分为加锁阶段和解锁阶段。

数据库原理与应用章节练习题及答案-第9章

数据库原理与应用章节练习题及答案-第9章

1.试述实现数据库安全性控制的常用方法和技术。

数据库安全性控制的常用技术包括用户标识与鉴别、存取控制、视图机制、审计、密码保护等。

2.什么是数据库中的自主存取控制方法和强制存取控制方法?在自主存取控制方法中,用户对于不同的数据对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可将其拥有的存取权限转授给其他用户。

DBMS通过验证用户是否具有对访问数据有相应的权限来决定是否允许用户执行数据访问。

在强制存取控制中,DBMS所管理的全部实体被分为主体和客体两大类。

主体和客体都具有自己的安全级别。

但主体访问客体时,不仅要求主体具有访问客体的权限,而且要求主体的安全级和客体的安全级之间满足支配关系。

3.DBMS的完整性控制机制应具有哪些功能?DBMS的数据库完整性控制机制应具有以下三个功能:(1)定义功能:提供定义完整性约束条件的机制;(2)检查功能:检查用户发出的操作请求是否违背了约束条件。

一般有两种检查方式:一种是立即执行约束(即一条语句执行完成后立即检查),另一种是延迟执行约束(即在整个事务执行完毕后再检查约束);(3)违约响应功能:如果操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。

4.试述事务的概念及事务的四个特性。

数据库系统中的事务是一个不可分的操作序列,其中的操作要么全部都不执行,要把全部都执行。

事务一般应满足四个性质,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

这四个性质在数据库领域中一般合称为事务的ACID性质。

(1)原子性事务的原子性是指一个事务内部的所有操作要么全部都执行,要么一个也不执行,即所有操作是一个整体。

(2)一致性事务的一致性是指事务的执行保证数据库从一个一致状态转到另一个一致状态,即数据不会应事务的执行而导致不一致。

但是,事务的内部无须满足数据库的一致性。

(完整版)数据库系统基础教程第九章答案

(完整版)数据库系统基础教程第九章答案

9.3.1a)In the following, we use macro NOT_FOUND as defined in the section.void closestMatchPC() {EXEC SQL BEGIN DECLARE SECTION;char manf, SQLSTATE[6];int targetPrice, /* holds price given by user */float tempSpeed, speedOfClosest;char tempModel[4], modelOfClosest[4];int tempPrice, priceOfClosest;/* for tuple just read from PC & closest price found so far */EXEC SQL END DECLARE SECTION;EXEC SQL DECLARE pcCursor CURSOR FORSELECT model, price, speed FROM PC;EXEC SQL OPEN pcCursor;/* ask user for target price and read the answer into variabletargetPrice *//* Initially, the first PC is the closest to the target price.If PC is empty, we cannot answer the question, and so abort. */EXEC SQL FETCH FROM pcCursorINTO :modelOfClosest, :priceOfClosest, :speedOfClosest;if(NOT_FOUND) /* print message and exit */ ;while(1) {EXEC SQL FETCH pcCursor INTO :tempModel, :tempPrice,:tempSpeed;if(NOT_FOUND) break;if(/*tempPrice closer to targetPrice than is priceOfClosest */){modelOfClosest = tempModel;priceOfClosest = tempPrice;speedOfClosest = tempSpeed;}}/* Now, modelOfClosest is the model whose price is closest totarget. We must get its manufacturer with a single-row select */EXEC SQL SELECT makerINTO :manfFROM ProductWHERE model = :modelOfClosest;printf("manf=%s, model=%d, speed=%d\n",manf, modelOfClosest, speedOfClosest);EXEC SQL CLOSE CURSOR pcCursor;}b)void acceptableLaptop() {EXEC SQL BEGIN DECLARE SECTION;int minRam, minHd, minScreen; /* given by user */float minSpeed;char model[4], maker,float speed;int ram, hd, screen, price;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE query1 FROM‘ SELECT model, speed, ram, hd, screen, price, maker FROM Laptop l, Product pWHERE speed >= ?AND ram >= ? ANDhd >= ? ANDscreen >= ? ANDl.model = p.model’EXEC SQL DECLARE cursor1 CURSOR FOR query1;/* ask user for minimum speed, ram, hd size, and screen size */EXEC SQL OPEN cursor1 USING :minSpeed, :minRam, :minHd, :minScreen;while(!NOT_FOUND) {EXEC SQL FETCH cursor1 INTO:model, :speed, :ram, :hd, :screen, :price, :maker;if(FOUND){printf("maker:%s, model:%d, \nspeed:%.2f, ram:%d, hd:%d, screen:%d, price:%d\n",maker, model, speed, ram, hd, screen, price);}}EXEC SQL CLOSE CURSOR cursor1;}c)void productsByMaker() {EXEC SQL BEGIN DECLARE SECTION;char maker, model[4], type[10], color[6];float speed;int ram, hd, screen, price;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE query1 FROM‘ SELECT * FROM PCWHERE model IN (SELECT model FROM ProductWHERE maker = ? ANDtype =‘ pc’ );EXEC SQL PREPARE query2 FROM‘ SELECT * FROM LaptopWHERE model IN (SELECT model FROM ProductWHERE maker = ? ANDtype =‘ laptop’ );EXEC SQL PREPARE query3 FROM‘ SELECT * FROM PrinterWHERE model IN (SELECT model FROM ProductWHERE maker = ? ANDtype =‘ printer’ );EXEC SQL DECLARE cursor1 CURSOR FOR query1;EXEC SQL DECLARE cursor2 CURSOR FOR query2;EXEC SQL DECLARE cursor3 CURSOR FOR query3;/* ask user for manufacturer */Printf(“ maker:%s n” , ma ker);/* get PCs made by the manufacturer */EXEC SQL OPEN cursor1 USING :maker;Printf( “ product type: PC n” );while(!NOT_FOUND) {EXEC SQL FETCH cursor1 INTO:model, :speed, :ram, :hd, :price;if(FOUND){n” , model, speed, ram, hd, price);}}/* get Laptops made by the manufacturer */EXEC SQL OPEN cursor2 USING :maker;Printf(“ product type: Laptop n” );while(!NOT_FOUND) {EXEC SQL FETCH cursor2 INTO:model, :speed, :ram, :hd, :screen, :price;if(FOUND){printf("model:%d, speed:%.2f, ram:%d, hd:%d, screen:%d,price:%d\n", model, speed, ram, hd, screen, price);}}/* get Printers made by the manufacturer */EXEC SQL OPEN cursor3 USING :maker;Printf(“ product type: Printer n”);while(!NOT_FOUND) {EXEC SQL FETCH cursor3 INTO:model, :color, :type, :price;if(FOUND){printf("model:%d, color:%s, type:%s, price:%d\n",model, color, type, price);}}EXEC SQL CLOSE CURSOR cursor1;EXEC SQL CLOSE CURSOR cursor2;EXEC SQL CLOSE CURSOR cursor3;}d)void withinBudget() {EXEC SQL BEGIN DECLARE SECTION;int total_budget, rest_budget, pc_price, printer_price;char pc_model[4], printer_model[4], color[6];float min_speed;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE query1 FROM‘ SELECT model, price FROM PCWHERE speed >= ? AND price <= ?ORDER BY price’;EXEC SQL PREPARE query2 FROM‘ SELECT model, price FROM PrinterWHERE price <= ? AND color = ?ORDER BY price’;EXEC SQL DECLARE cursor1 CURSOR FOR query1;EXEC SQL DECLARE cursor2 CURSOR FOR query2;/* ask user for budget & the minimum speed of pc *//* get the cheapest PC of the minimum speed */EXEC SQL OPEN cursor1 USING :min_speed, :total_budget;EXEC SQL FETCH cursor1 INTO :pc_model, :pc_price;if (NOT_FOUND)Printf( “ no pc f n” );else{Printf( “ pc model: %s n” , pc_model);}/* get Printer within the budget–pc_price;*/ rest_budget = total_budgetcolor = “ true ”;EXEC SQL OPEN cursor2 USING :rest_budget, :color;EXEC SQL FETCH cursor2 INTO :printer_model;if(NOT_FOUND) {EXEC SQL CLOSE CURSOR cursor2;color =“ false”;EXEC SQL OPEN cursor2 USING :rest_budget, :color;if(NOT_FOUND)n” );printf(“ no printer found within the budgetelse {EXEC SQL FETCH cursor2 INTO :printer_model;printf(“ printer model: %s n” , printer_model);}}else {printf( “ printer model: %s n” , printer_model);}EXEC SQL CLOSE CURSOR cursor1;EXEC SQL CLOSE CURSOR cursor2;}e)void newPCproduct() {EXEC SQL BEGIN DECLARE SECTION;char pmaker, pmodel[4], ptype[6];float pspeed;int pram, phd, pscreen, pprice;int pcount;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE stmt1 FROM‘ SELECT COUNT(*) INTO :countFROM PCWHERE MODEL = ?;EXEC SQL PREPARE stmt2 FROM‘ INSERT INTO Product VALUES(?, ?, ?) ’;EXEC SQL PREPARE stmt3 FROM‘ INSERT INTO PC VALUES(?, ?, ?, ?, ?) ’;/* ask user for manufacturer, model, speed, RAM, hard-disk,& price of a new PC*/EXEC SQL EXECUTE stmt1 USING :pmodel;IF (count > 0)Printf( “ Warnning: The PC model already exists n” );ELSE{EXEC SQL EXECUTE stmt2 USING :pmaker, :pmodel, :ptype;EXEC SQL EXECUTE stmt3 UINGNG :pmodel, :pspeed, :pram,:phd, :pprice }}9.3.2a)void largestFirepower() {EXEC SQL BEGIN DECLARE SECTION;char cclass[20], maxFirepowerClass[20];int cnumGuns, cbore;float firepower, maxFirepower;EXEC SQL END DECLARE SECTION;EXEC SQL DECLARE cursor1 CURSOR FORSELECT class, numGuns, bore FROM Classes;EXEC SQL OPEN cursor1;EXEC SQL FETCH FROM cursor1 INTO :cclass, :cnumGuns, :cbore;if(NOT_FOUND) /* print message and exit */ ;maxFirepower = cnumGuns * (power (cbore, 3));strcpy(maxFirepowerClass, cclass);while(1) {EXEC SQL FETCH cursor1 INTO :cclass, :cnumGuns, :cbore;if(NOT_FOUND) break;firepower = cnumGuns * (power (cbore, 3));if( firepower > maxFirepower ){maxFirepower = firepower;strcpy(maxFirepowerClass, cclass);}}printf("Class of maximum firepower :%s\n", maxFirepowerClass);EXEC SQL CLOSE CURSOR cursor1;}b)void getCountry() {EXEC SQL BEGIN DECLARE SECTION;char ibattle[20], iresult[10], ocountry[20];char stmt1[200], stmt2[200];EXEC SQL END DECLARE SECTION;strcpy(stmt1,“ SELECT COUNTRY FROM Classes CWHERE C.class IN (SELECT S.class FROM Ships SWHERE IN (SELECT ship FROM OutcomesWHERE battle = ?))” );Strcpy(stm2,“ SELECT country FROM ClassesWHERE class = ( SELECT MAX(COUNT(class))FROM Ships s, Outcomes oWHERE = s.ship ANDs.result =‘ ?’ )” );EXEC SQL PREPARE query1 FROM stmt1;EXEC SQL PREPARE query2 FROM stmt2;EXEC SQL DECLARE cursor1 CURSOR FOR query1;EXEC SQL DECLARE cursor2 CURSOR FOR query2;/* ask user for battle *//* get countries of the ships involved in the battle */EXEC SQL OPEN cursor1 USING :ibattle;while(!NOT_FOUND) {EXEC SQL FETCH cursor1 INTO :ocountry;if(FOUND)n” , ocoutry);}EXEC SQL CLOSE CURSOR cursor1;/* get the country with the most ships sunk */strcpy(iresult,“ sunk” );EXEC SQL OPEN cursor2 USING :iresult;/* loop for the case there ’ s the same max# of ships sunk */While(!NOT_FOUND) {EXEC SQL FETCH cursor2 INTO :ocountry;If(FOUND)Printf(}/* get the country with the most ships damaged */strcpy(iresult, “ damaged ” ); EXEC SQL OPEN cursor2 USING :iresult;/* loop for the case there ’ s the same max# of ships damaged */While(!NOT_FOUND) {EXEC SQL FETCH cursor2 INTO :ocountry;If(FOUND)Printf(}} c)void addShips() {EXEC SQL BEGIN DECLARE SECTION; char iclass[20], itype[3], icontry[20], iship[20]; int inumGuns, ibore, idisplacement, ilaunched; char stmt1[100], stmt2[100]; EXEC SQL END DECLARE SECTION;strcpy(stmt1,“ INSERT INTO Classes VALUES (?, ?, ?, ?, ?, ?)” );strcpy(stmt2,“ INSERT INTO Ships VALUES (?, ?, ?)” );/* ask user for a class and other info for Classes table */EXEC SQL EXECUTE IMMEDATE :stmt1USING :iclass, :itype, :icontry,:inumGuns, :ibore, :idisplacement;/* ask user for a ship and launched */WHILE(there_is_input){“ country with the most ships damaged: %s, ocountry);“ country with the most ships sunk: %s, ocountry);EXEC SQL EXECUTE IMMEDATE :stmt2USING :iship, :iclass, ilaunched;/* ask user for a ship and launched */}}d)void findError() {EXEC SQL BEGIN DECLARE SECTION;char bname[20], bdate[8], newbdate[8];char sname[20], lyear[4], newlyear[4];char stmt1[100], stmt2[100];EXEC SQL END DECLARE SECTION;strcpy(stmt1, strcpy(stmt2, “ UPDATE Battles SET date = ? WHERE name = ?“ UPDATE Ships SET launched = ? WHERE name = ?” );” );EXEC SQL DECLARE C1 CURSOR FORSelect , b.date, , unchedFROM Battles b, Outcomes o, Ships sWHERE = o.battle ANDo.ship = ANDYEAR(b.date) < unched;EXEC SQL OPEN C1;while(!NOT_FOUND) {EXEC SQL FETCH C1 INTO :bname, :bdate, :sname, :lyear;/* prompt user and ask if a change is needed */if(change_battle){/* get a new battle date to newbdate */EXEC SQL EXECUTE IMMEDATE :stmt1USING :bname, :newbdate;}if(change_ship){/* get a new launched year to newlyear */EXEC SQL EXECUTE IMMEDATE :stmt2USING :sname, :newlyear;}}}9.4.1a)CREATE FUNCTION PresNetWorth(studioName CHAR[15]) RETURNS INTEGER DECLARE presNetWorth INT;BEGINSELECT netWorthINTO presNetWorthFROM Studio, MovieExecWHERE = studioName AND presC# = cert#;RETURN(presNetWorth);END;b)CREATE FUNCTION status(person CHAR(30), addr CHAR(255)) RETURNS INTEGERDECLARE isStar INT;DECLARE isExec INT;BEGINSELECT COUNT(*)INTO isStarFROM MovieStarWHERE = person AND MovieStar.address = addr;SELECT COUNT(*)INTO isExecFROM MovieExecWHERE = person AND MovieExec.address = addr;IF isStar + isExec = 0 THEN RETURN(4) ELSE RETURN(isStar +2*isExec)END IF;END;c)CREATE PROCEDURE twoLongest(IN studio CHAR(15),OUT longest VARCHAR(255),OUT second VARCHAR(255))DECLARE t VARCHAR(255);DECLARE i INT;DECLARE Not_Found CONDITION FOR SQLSTATE = '02000';DECLARE MovieCursor CURSOR FORSELECT title FROM Movies WHERE studioName = studioORDER BY length DESC;BEGINSET longest = NULL;SET second = NULL;OPEN MovieCursor;SET i = 0;mainLoop: WHILE (i < 2) DOFETCH MovieCursor INTO t;IF Not_Found THEN LEAVE mainLoop END IF;SET i = i + 1;END WHILE;CLOSE MovieCursor;END;d)CREATE PROCEDURE earliest120mMovie(IN star CHAR(30),OUT earliestYear INT)DECLARE Not_Found CONDITION FOR SQLSTATE = '02000'; DECLARE MovieCursor CURSOR FORSELECT MIN(year) FROM MoviesWHERE length > 120 ANDtitle IN (SELECT movieTitle FROM StarsInWHERE starName = star);BEGINSET earliestYear = 0;OPEN MovieCursor;FETCH MovieCursor INTO earliestYear;CLOSE MovieCursor;END;e)CREATE PROCEDURE uniqueStar(IN addr CHAR(255),OUT star CHAR(30))BEGINSET star = NULL;IF 1 = (SELECT COUNT(*) FROM MovieStar WHERE address = addr) THENSELECT name INTO star FROM MovieStar WHERE address = addr; END;f)CREATE PROCEDURE removeStar(IN star CHAR(30))BEGINDELETE FROM Movies WHERE title IN(SELECT movieTitle FROM StarsIn WHERE starName = star); DELETE FROM StarsIn WHERE starName = star;DELETE FROM MovieStar WHERE name = star;END;9.4.2a)CREATE FUNCTION closestMatchPC(targetPrice INT) RETURNS CHAR DECLARE closestModel CHAR(4);DECLARE diffSq INT;DECLARE currSq INT;DECLARE m CHAR(4);DECLARE p INT;DECLARE Not_Found CONDITION FOR SQLSTATE '02000'; DECLARE PCCursor CURSOR FORSELECT model, price FROM PC;BEGINSET closestModel = NULL;SET diffSq = -1;OPEN PCCursor;mainLoop: LOOPFETCH PCCursor INTO m, p;IF Not_Found THEN LEAVE mainLoop END IF;SET currSq = (p - targetPrice)*(p - targetPrice);IF diffSq = -1 OR diffSq > currSqTHEN BEGINSET closestModel = m;SET diffSq = currSq;END IF;END LOOP;CLOSE PDCursor;RETURN(closestModel);END;b)CREATE FUNCTION getPrice(imaker CHAR(1), imodel CHAR(4))RETURNS INTEGERDECLARE ptype VARCHAR(10);DECLARE pprice INT;DECLARE Not_Found CONDITION FOR SQLSTATE '02000';BEGINSELECT type INTO ptype FROM ProductWHERE maker = imaker AND model = imodel;IF ptype =‘ pc’ THENSELECT price INTO pprice FROM PCWHERE model = imodel;ELSE IF ptype =‘ laptop’ THENSELECT price INTO pprice FROM LaptopWHERE model = imodel;ELSE IF ptype =‘ printer’ THENSELECT price INTO pprice FROM PrinterWHERE model = imodel;ELSEpprice = NULL;END IF;RETURN (pprice);END;c)CREATE PROCEDURE addPC(IN imodel INT,IN ispeed DECIMAL(3,2),IN iram INT,IN ihd INT,IN iprice INT)DECLARE Already_Exist CONDITION FOR SQLSTATE '02300';BEGININSERT INTO PC VALUES(imodel, ispeed, iram, ihd, iprice); WHILE (Already_Exist) DOSET imodel = imodel + 1;INSERT INTO PC VALUES(imodel, ispeed, iram, ihd, iprice); END WHILE;END;d)CREATE PROCEDURE getNumOfHigherPrice(IN iprice INT,OUT NumOfPCs INT,OUT NumOfLaptops INT,OUT NumOfPrinters INT)BEGINSET NumOfPCs = 0;SET NumOfLaptops = 0;SET NumOfPrinters = 0;SELECT COUNT(*) INTO NumOfPCs FROM PCWHERE price > iprice;SELECT COUNT(*) INTO NumOfLaptops FROM Laptop WHERE price > iprice;SELECT COUNT(*) INTO NumOfPrinters FROM PrinterWHERE price > iprice;END;9.4.3a)CREATE FUNCTION getFirepower(iclass VARCHAR(10)) RETURNS INTEGER DECLARE firepower INT;DECLARE nguns INT;DECLARE nbore INT;BEGINSELECT numGuns, bore INTO nguns, nbore FROM ClassesWHERE class = iclass;SET firepower = nguns * (nbore * nbore * nbore);RETURN(firepower);END;b)CREATE PROCEDURE twoCountriesInBattle(IN ibattle VARCHAR(20),OUT firstCountry VARCHAR(20),OUT secondCountry VARCHAR(20))DECLARE i INT;DECLARE ocountry VARCHAR(20);DECLARE classCursor CURSOR FORSELECT country FROM ClassesWHERE class IN(SELECT class FROM ShipsWHERE name IN(SELECT ship FROM OutcomesWHERE battle = ibattle));BEGINSET firstCountry = NULL;SET secondCountry = NULL;SET i = 0;IF 2 = (SELECT COUNT(*) count FROM ClassesWHERE class IN(SELECT class FROM ShipsWHERE name IN(SELECT ship FROM OutcomesWHERE battle = ibattle)))THENOPEN classCursor;WHILE (i < 2) DOFETCH classCursor INTO ocountry;IF (i = 0) THENSET firstCountry = ocountry;ELSESET secoundCountry = ocountry;END IF;END WHILE;END IF;CLOSE calssCursor;END;c)CREATE PROCEDURE addClass(IN iship VARCHAR(20),IN iclass VARCHAR(20),IN itype CHAR(2),IN icountry VARCHAR(20),IN inumGuns INT,IN ibore INT,IN idisplacement INT)BEGININSERT INTO Classes VALUES(iclass, itype, icountry,inumGuns, ibore, idisplacement); INSERT INTO Ships VALUES(iship, iclass, NULL);END;d)CREATE PROCEDURE checkLaunched(IN ship VARCHAR(20))DECLARE bname VARCHAR(20);BEGINIF EXIST (SELECT INTO bnameFROM Battles b, Outcomes o, Ships sWHERE = o.battle ANDo.ship = ANDYEAR(b.date) < unched)THENUPDATE Ships SET launced = 0 WHERE name = iship;UPDATE Battles SET date = 0 WHERE name = bname; END IF;END9.4.49.5.1a)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR manf, tempModel[4];SQLFLOAT tempSpeed;SQLINTEGER tempPrice;SQLINTEGER colInfo;Int targetPrice;char modelOfClosest[4];float speedOfClosest;int priceOfClosest;/* ask user for target price and read the answer into variabletargetPrice*/errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV. n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC. n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}SQLExecDirect(execStat, “ SELECT model, price, speed FROM PC ” , SQL_NTS);SQLBindCol(execStat, 1, SQL_CHAR, tempModel,sizeof(tempModel), &colInfo);SQLBindCol(execStat, 2, SQL_INTEGER, tempPrice,sizeof(tempPrice), &colInfo);SQLBindCol(execStat, 3, SQL_FLOAT, tempSpeed,sizeof(tempSpeed), &colInfo);priceOfClosest = NULL;while(SQLFetch(execStat) != SQL_NO_DATA) {if( /* the 1st fetch or tempPrice closer to targetPrice */modelOfClosest = tempModel;priceOfClosest = tempPrice;speedOfClosest = tempSpeed;}}/* Now, modelOfClosest is the model whose price is closest totarget. We must get its manufacturer with a single-row select*/if (priceOfClosest == NULL ) /* no data fetched *//* print error message and exit */SQLPrepare (execStat,“ SELECT maker FROM Product WHERE model = ? ” , SQL_NTS); SQLBindParameter(execStat, 1,⋯,modelOfClosest,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQLCHAR, &manf, sizeof(manf), &colInfo);/* print manf */b)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR model[4], maker;SQLFLOAT minSpeed;SQLINTEGER minRam, minHd, minScreen;SQLFLOAT speed;SQLINTEGER ram, hd, screen;SQLINTEGER colInfo;/* ask user for minimum speed, ram, hd size, and screen size */errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV. n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC. n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}SQLPrepare(execStat,“ SELECT model, speed, ram, hd, screen, price, maker“ FROM Laptop l, Product p”||“ WHERE speed >= ? AND ” ||“ ram >= ? AND”||“ hd >= ? AND”||“ screen >= ? AND”||“ l.model = p.model”,”||SQL_NTS);SQLBindParameter(execStat, 1, SQL_FLOAT, ⋯ , minSpeed, ⋯ ); SQLBindParameter (execStat, 2, SQL_INTEGER, ⋯ , minRam, ⋯ );SQLBindParameter (execStat, 3, SQL_ SQLBindParameter (execStat, 4, SQL_ INTEGER,INTEGER,⋯ , minHd, ⋯ );⋯ , minScreen, ⋯ );SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo); SQLBindCol(execStat, 2, SQL_FLOAT, speed,sizeof(speed), &colInfo);SQLBindCol(execStat, 3, SQL_INTEGER, ram,sizeof(ram), &colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, hd,sizeof(hd), &colInfo);SQLBindCol(execStat, 5, SQL_INTEGER, screen,sizeof(screen), &colInfo);SQLBindCol(execStat, 6, SQL_INTEGER, price,sizeof(price), &colInfo);SQLBindCol(execStat, 7, SQL_CHAR, maker,sizeof(maker), &colInfo);while(SQLFetch(execStat) != SQL_NO_DATA) {if( FOUND )/* print fetched info */}c)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR maker, model[4], type[10], color[6];SQLFLOAT speed;SQLINTEGER ram, hd, screen, price;SQLINTEGER colInfo;/* ask user for minimum speed, ram, hd size, and screen size */errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv); if(errCode1) {printf( ” Error for SQL_HANDLE_ENV. n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC.n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT.n” );exit(1);}/* get PCs made by the manufacturer */SQLPrepare(execStat,“ SELECT * FROM PC WHERE model IN ( ” ||“ SELECT model FROM Product ” ||“ WHERE maker = ? AND ” ||“ type = ‘ pc’”, SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, maker,⋯); SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo); SQLBindCol(execStat, 2, SQL_FLOAT, speed,sizeof(speed), &colInfo);SQLBindCol(execStat, 3, SQL_INTEGER, ram,sizeof(ram), &colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, hd,sizeof(hd), &colInfo);SQLBindCol(execStat, 5, SQL_INTEGER, price,sizeof(price), &colInfo);while(SQLFetch(execStat) != SQL_NO_DATA) {if( FOUND )/* print fetched info */}/* get Laptops made by the manufacturer */SQLPrepare(execStat,“ SELECT * FROM Laptop WHERE model IN ( ” ||“ SELECT model FROM Product ” ||“ WHERE maker = ? AND ” ||“ type = ‘ laptop ’”, SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, maker,⋯); SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo);SQLBindCol(execStat, 2, SQL_FLOAT, speed,sizeof(speed), &colInfo);SQLBindCol(execStat, 3, SQL_INTEGER, ram,sizeof(ram), &colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, hd,sizeof(hd), &colInfo);SQLBindCol(execStat, 5, SQL_INTEGER, screen,sizeof(screen), &colInfo);SQLBindCol(execStat, 6, SQL_INTEGER, price,sizeof(price), &colInfo);while(SQLFetch(execStat) != SQL_NO_DATA) {if( FOUND )/* print fetched info */}/* get Printers made by the manufacturer */SQLPrepare(execStat,“ SELECT * FROM Printer WHERE model IN (”||“ SELECT model FROM Product”||“ WHERE maker = ? AND ” ||“ type =‘printer’”,SQL_NTS);SQLBindPara meter(execStat, 1, SQL_CHAR,⋯, maker,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo);SQLBindCol(execStat, 2, SQL_CHAR, color, sizeof(color), $colInfo);SQLBindCol(execStat, 3, SQL_CHAR, type, sizeof(type), $colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, price, sizeof(price), &colInfo);d)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLINTEGER total_budget, rest_budget, pc_price, printer_price;SQLCHAR pc_model[4], printer_model[4], color[6];SQLFLOAT min_speed;errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV.n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC.n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}SQLPrepare(execStat,“SELECT model, price FROM PCWHERE speed >= ? AND price <= ? ORDERBY price ”,SQL_NTS);/* ask user for budget & the minimum speed of pc *//* get the cheapest PC of the minimum speed */SQLBindParameter(execStat, 1, SQL_FLOAT , ⋯ ,min_speed , ⋯ ); SQLBindParameter(execStat, 2, SQL_INTEGER, ⋯ , total_budget, ⋯ );SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, pc_model, sizeof(pc_model),&colInfo);SQLBindCol(execStat, 2, SQL_INGETER, pc_price,sizeof(pc_price),&colInfo);SQLFetch(execStat);if (NOT_FOUND) {p rintf(“no pc found within the budget n” );}else {p rintf( “ pc model: %s n” , pc_model);}/* get Printer within the budget */–pc_price;rest_budget = total_budgetcolor =“true”;SQLPrepare(execStat,“SELECT model, price FROM PrinterWHERE price <= ? AND color = ?ORDER BY price ” , SQL_NTS);SQLBindParameter(execStat, 1, SQL_INTEGER , ⋯ , rest_budget , ⋯ ); SQLBindParameter(execStat, 2, SQL_CHAR, ⋯ , color , ⋯ );SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, print_model,sizeof(print_model),&colInfo);SQLBindCol(execStat, 2, SQL_INGETER, print_price,sizeof(print_price),&colInfo);SQLFetch(execStat);if(NOT_FOUND) {color =“false”;SQLBindParameter(execStat, 1, SQL_INTEGER,⋯, rest_budget,⋯);SQLBindParameter(execStat, 2, SQL_CHAR,⋯, color,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, print_model,sizeof(print_model),&colInfo);SQLBindCol(execStat, 2, SQL_INGETER, print_price,sizeof(print_price),&colInfo);SQLFetch(execStat);if(NOT_FOUND)printf( “ no printer found within the budget n” );elseprintf( “ printer model: %s n” , printer_model);}elseprintf( “ printer model: %s n” , printer_model);}e)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR pmodel[4], pmaker, ptype[6];SQLFLOAT pspeed;SQLINTEGER pram, phd, pscreen, pprice, count;SQLINTEGER colInfo;/* ask user for minimum speed, ram, hd size, and screen size */errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV.n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}/* ask user for manufacturer, model, speed, RAM, hard-disk, *//* & price of a new PC */SQLPrepare(execStat,“ SELECT COUNT(*) FROM PC WHERE model = ?”, SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, pmodel,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_INTEGER, count, sizeof(count), &colInfo);SQLFetch(execStat);if (count >0){ Printf( “ Warnning: The PC model already exists n” ); }else {” , SQLPrepare(execStat,“ INSERT INTO Product VALUES(?, ?, ?)SQL_NTS);SQLBindParame ter(execStat, 1, SQL_CHAR,⋯, pmaker,⋯);SQLBindParameter(execStat, 2, SQL_CHAR,⋯, pmodel,⋯);SQLBindParameter(execStat, 3, SQL_CHAR,⋯, ptype,⋯); SQLExecute(execStat);” , SQLPrepare(execStat,“ INSERT INTO PC VALUES(?, ?, ?, ?, ?)SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, pmodel,⋯);SQLBindParameter(execStat, 2, SQL_FLOAT,⋯, pspeed,⋯);SQLBindParameter(execStat, 3, SQL_INTEGER,⋯, pram,⋯); SQLBindParameter(e xecStat, 4, SQL_INTEGER,⋯, phd,⋯);SQLBindParameter(execStat, 5, SQL_INTEGER,⋯, pprice,⋯); SQLExecute(execStat);}9.5.2a)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR cclass[20], maxFirepowerClass[20];SQLFLOAT firepower, maxFirepower;SQLINTEGER cnumGuns, cbore;。

数据库系统与应用课后习题答案

数据库系统与应用课后习题答案

第九章数据库应用设计方法1.试述数据库设计的基本过程。

答:数据库设计过程通常包括六个阶段: ( l )需求分析; ( 2 )概念结构设计; ( 3 )逻辑结构设计及优化; ( 4 )数据库物理设计; ( 5 )数据库实现; ( 6 )数据库运行和维护。

这是一个完整的实际数据库及其应用系统的设计过程。

设计一个完善的数据库应用系统往往是上述六个阶段的不断反复。

2.简述需求分析的步骤。

答:一般来说,需求分析工作可分为需求调研、需求分析、需求规范说明书编制和需求验证4个步骤。

1)需求调研是通过了解用户的组织机构情况、了解用户各部门的业务活动情况、确定系统边界等工作完成用户需求的收集、调查。

2)需求分析。

完成对用户活动的调查分析后,还需要进一步分析和抽象用户的需求,使之转换为后续各设计阶段可用的形式。

具体来说就是用户对数据库应用系统的各种需求,包括用户对数据信息存储的需求、数据信息的处理需求、业务数据流需求等。

需求分析的方法主要包括原型化方法、结构化方法及数据流分析方法等。

3)需求规范说明书编制。

需求规范说明书阐述数据库应用系统所必须提供的功能和性能要求,以及运行的实际约束条件。

需求规范说明书以书面方式记录用户与开发方所达成的产品需求协议条款,不仅是用户对最终产品的接受基础,也是开发方在进行设计、实现与测试运行的规范。

4)需求验证。

需求验证主要包括有效性验证、一致性验证和完备性验证。

3.数据字典的内容是什么?答:数据字典存放了系统所用到的数据信息,通常数据字典包含了5个基本组成部分:数据项、数据结构、数据流、数据存储和处理过程。

1)数据项。

数据项记录了数据对象的基本信息,是不可再分的基本数据单位,描述了数据的静态特性。

数据项包含了对数据对象的区分数据对象完整性、一致性约束的描述。

2)数据结构。

数据结构反映了数据之间的组合关系,也可以是由多个数据结构的复合。

3)数据流。

数据流是对数据动态特性的描述,表示了数据结构沿着系统的事务和处理过程中的传输流向。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⑷ 使用什么语句可以打开游标,打开成功后,游标指针指向结果集的什么位置? 答: 使用 OPEN cursor_name 语句打开游标。当游标打开成功后,游标指针指向结果集的 第一行。
⑸ 请说明语句 DELETE FROM stud_info WHERE CURRENT OF stud_cursor 的作用。 答:
列 Spid Dbid Obiid 3
数据类型 smallint smallint int
含义 SQL Server 进程标识号。 锁定资源的数据库标识号。 锁定资源的数据库对象标识号。
Indid
Type
Resoure Mode Status
smallint
nchar(4)
nchar(16) nvarchar(8) int
FOR SELECT name FROM sysobjects WHERE objectproperty(id,'IsUserTable')=1 ORDER BY name OPEN tnames_cursor FETCH NEXT FROM tnames_cursor INTO @table_name WHILE (@@FETCH_STATUS = 0 ) BEGIN EXEC sp_spaceused @tablename FETCH NEXT FROM tnames_cursor INTO @tablename END CLOSE tnames_cursor DEALLOCATE tnames_cursor
END
程序片段的功能是:利用游标 stud_cursor,将 stud_info 表中的学号、姓名、课程号、 成绩提取到变量,然后将其显示出来。
游标变量定义: DECLARE stud_cursor CURSOR FOR SELECT * FROM stud_grade
⑺ 请用适当的语句完善下列程序。 USE student GO DECLARE teacher_cursor CURSOR
2. 按照题目要求在 SQL 编辑器中输入 T-SQL 语句,并进行调试。 ⑴ 定义一个事务向 stud_info 表输入新的数据记录,如果所输入的学号与表中重复, 则回滚撤消,否则提交完成。 USE student GO ALTER TABLE stud_info ADD CONSTRAINT UN_stud_id UNIQUE(stud_id) GO BEGIN TRAN stud_transaction INSERT INTO stud_info VALUES ('0401010811',N'黄康','06-20-1989',N'男',
USE student GO BEGIN TRAN student_manager UPDATE stud_grade = ROUND(SQRT(grade)*10,0) WHERE course_id LIKE '%06' IF @@ERROR!=0
ROLLBACK TRAN student_manager ELSE
N'北京市海淀区','010-64572345','100080',560); IF @@ERROR!=0
ROLLBACK TRAN stud_transaction ELSE
COMMIT TRAN stud_transaction
⑵ 在 student 数据库中创建一个用户定义的事务,以实现事务的回滚操作和事务的存 储点回滚操作。
5
⑴ 此例中的游标名是什么? 游标名是 tnames_cursor。 ⑵ 此例中的游标类型是什么? 缺省时,即不指定游标类型为 FOR UPDATE。此时,可以删除或更新游标所指向的结 果集中的行。 ⑶ 此例中的游标所指示的结果集是什么? SELECT NAME FROM sysobjects WHERE obiectsproperty(id,’IsUserTable’)=1 ORDER BY name ⑷ 请说明 sp_spaceused @tablename 语句的作用。 EXEC exec sp_spaceused @tablename 的作用是查看表所使用的空间情况。 ⑸ 请说明 FETCH NEXT FROM tnames_cursor INTO @table_name 语句的作用。 读取游标 tnames_cursor 所指向的行中数据存放到目的变量@table_name。 ⑹ 请说明此例中的循环条件。 @@FETCH_STATUS=0
锁定资源的索引标识号。 锁的类型:DB 数据库;FIL 文件;IDX 索引;PG 页;KBY 键; TAB 表;EXT 区域;RID 行标识符。 被锁定的资源信息。
请求资源的锁类型。如 S 表示 Share Locks,共享锁。
锁的请求状态:GRANT 锁定;WAIT 阻塞;CNVRT 转换。
⑸ 下面程序清单是一个简单的游标声明的示例,试述该游标的功能。 DECLARE stud_cursor CURSOR FOR SELECT t.stud_id, s.grade FROM stud_info t JOIN stud_grade s ON t.stud_id=s.stud_id WHERE s.grade >80 所声明的游标 stud_cursor 功能是:游标指针指向(学生信息表 stud_info 和学生成绩表 stud_grade 两表查询,其中分数大于 80、学号一致)的结果集。
ROLLBACK WORK save_point ELSE
COMMIT TRAN student_manager1
⑶ 创建一个事务同时更新 student 数据库中的 stud_info 表和 stud_grade 表中的 stud_id 列,如果数据更新有错则取消更新操作。
USE student GO BEGIN TRAN student_manager2 UPDATE stud_info SET stud_id='0401010515' WHERE stud_id='0401010811' UPDATE stud_grade SET stud_id='0401010515' WHERE stud_id='0401010811' IF ERROR!=0
只删除表 stud_info 游标 stud_cursor 所指向的当前行。
⑹ FETCH 可以从游标所指示的结果集中提取数据,但是提取数据位置由可选项 [NEXT|PRIOR|FIRST|LASTABSOLUTE{n|@n}|RELATIVE{n|@n}]决定,请分别说明各选 项的作用。@@FETCH_STATUS 保存着最后 FETCH 语句执行后的状态信息。返回值为 0、 -1、-2 时分别代表什么含意?
USE student GO UPDATE stud_grade SET grade=91 WHERE stud_id='0401010811' GO EXEC SP_LOCK GO SELECT grade FROM stud_grade WHERE stud_id='0401010811' GO EXEC SP_LOCK
/* 删除游标中的第一行数据 */
DELETE FROM teacher_info WHERE CURRENT OF teacher_cursor
CLOSE teacher_cursor
3. 阅读下列 T-SQL 语句,回答下列问题。 USE student DECLARE @tablename nvarchar(256) DECLARE tnames_cursor CURSOR
答: [NEXT|PRIOR|FIRST|LAST]为游标的移动方向,其中 NEXT 是向下移动,PRIOR 是 向上移动,FIRST 是从游标的第一位移动,LAST 是从游标的最后一位移动。 [ABSOLUTE{n|@n}]为对整张表,[RELATIVE{n|@n}]为相对以指定行。 @@FETCH_STATUS 保存着最后 FETCH 语句执行后的状态信息。返回值为 0 表示成 功完成 fetch 语句,返回值为-1 表示 fetch 语句有错误,或者当前游标指针已在集中的最后 一行,结果集中不再有数据,返回值为-2 表示提取的行不存在。
4
FOR SELECT * FROM teacher_info
OPEN teacher_currsor --打开游标
FETCH NEXT FROM teacher_cursor WHILE @@FETCH_STATUS = 0 BEGIN
FETCH NEXT FROM teacher_cursor --提取数据

COMMIT TRAN student_manager
USE student GO BEGIN TRAN student_manager1 UPDATE stud_grade=FLOOR(SQRT(grade)*10) WHERE course_id LIKE '%03' SAVE TRAN save_point UPDATE stud_grade=ROUND(SQRT(grade)*10,0) WHERE courde_id LIKE '%06' IF @@ERROE != 0
⑶ 什么是游标?如何声明一个游标? 答: 游标是一种处理数据的方法,为了查看或者处理集中的数据,游标提供了在结果集中 向前或者向后浏览数据的能力。它是一个与 SELECT 语句相关联的符号,它使用户可以逐 行访问由 SQL Server 返回的结果集。可以把游标看成是一种指针,它既可以指向当前位置, 也可以指向结果集的任意位置,它允许用户对指定位置的数据进行处理,可以把结果集中 的数据放在数组,应用程序或其他地方。 声明游标用的语句是: DECLARE cursor_name CURSOR FOR select_statement [FOR {READ ONLY UPDATE [OF column_name_list[,……]]}]
相关文档
最新文档