1.什么是数据的安全性?答:数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏2.什么是数据库的完整性?答:数据库的完整性是指数据的正确性和相容性。3.数据库的安全性和完整性有什么关系?答:数据的完整性和安全性是两个不同的概念,但是有一定的联系。前者是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓垃圾进垃圾出所造成的无效操作和错误结果。后者是保护数据库防止恶意的破坏和非法的存取。也就是说,安全性措施的防范对象是非法用户和非法操作,完整性措施的防范对象是不合语义的数据。4.试述实现数据库安全性控制的常用方法和技术。答:实现数据库安全性控制的常用方法和技术有:(1)用户标识和鉴别:该方法由系统提供一定的方式让用户标识自己的名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供系统的使用权。(2)存取控制:通过用户权限定义和合法权检查确保只有合法权限的用户访问数据库,所有未被授权的人员无法存取数据。例如C2级中的自主存取控制(DAC),B1级中的强制存取控制(MAC)。(3)视图机制:为不同的用户定义视图,通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动地对数据提供一定程度的安全保护。(4)审计:建立审计日志,把用户对数据库的所有操作自动记录下来放入审计日志中,DBA可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。(5)数据加密:对存储和传输的数据进行加密处理,从而使得不知道解密算法的人无法获知数据的内容。5.什么是数据库的审计功能,为什么要提供审计功能?答:审计功能是指DBMS的审计模块在用户对数据库执行操作的同时把所有操作自动记录到系统的审计日志中。因为任何系统的安全保护措施都不是完美无缺的,蓄意盗窃破坏数据的人总可能存在。利用数据库的审计功能,DBA可以根据审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。6.什么是数据库的完整性约束条件?完整性约束条件可分为哪几类?DBMS的完整性控制机制应具有哪些功能?答:Q1:完整性约束条件是指数据库中的数据应该满足的语义约束条件。Q2:一般可以分为六类:静态列级约束、静态元组约束、静态关系约束、动态列级约束、动态元组约束、动态关系约束。静态列级约束是对一个列的取值域的说明,包括以下几个方面:(1)对数据类型的约束,包括数据的类型、长度、单位可精度等;(2)对数据格式的约束;(3)对取值范围或取值集合的约束;(4)对空值的约束;(5)其他约束。静态元组约束就是规定组成一个元组的各个列之间的约束关系,静态元组约束只局限在单个元组上。静态关系约束是在一个关系的各个元组之间或者若干关系之间常常存在各种联系或约束。常见的静态关系约束有:(1)实体完整性约束;(2)参照完整性约束;(3)函数依赖约束。动态列级约束是修改列定义或列值时应满足的约束条件,包括下面两方面:(1)修改列定义时的约束;(2)修改列值时的约束。动态元组约束是指修改某个元组的值时需要参照其旧值,并且新旧值之间需要满足某种约束条件。动态关系约束是加在关系变化前后状态上的限制条件,例如事务一致性、原子性等约束条件。Q3:DBMS的完整性控制机制应具有三个方面的功能:(1)定义功能,即提供定义完整性约束条件的机制;(2)检查功能,即检查用户发出的操作请求是否违背了完整性约束条件;(3)违约反应,如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。7.SQL中提供了哪些数据控制语句(自主存取控制)的语句?请试举几例说明他们的使用方法答:SQL中的自主存取控制是通过GRANT语句和REVOKE语句来实现的。如:GRANTSELECT,INSERTONStudentTO王平WITHGRANTOPTION;就将Student表的SELECT和INSERT权限授予了用户王平,后面的“WITHGRANTOPTION”子句表示用户王平同时也获得了“授权”的权限,即可以把得到的权限继续授予其他用户。REVOKEINSERTONStudentFROM王平CASCADE;就将Student表的INSERT权限从用户王平处收回,选项CASCADE表示,如果用户王平将Student的INSERT权限又转授给了其他用户,那么这些权限也将从其他用户处收回。8.什么是事务?它有哪些属性?答:事务是数据库的逻辑工作单位,它是用户定义的一组操作序列,这些操作要么全做,要么全不做。事务有四种属性(ACID),原子性、一致性、隔离性、持久性。9.在数据库中为什么要并发控制?答:数据库是共享资源,通常有许多个事务同时在运行。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。10.并发操作可能会引起哪几类数据不一致?用什么方法能避免这些不一致的情况?答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏’数据。(1)丢失修改:两个事务Tl和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了)Tl提交的结果,导致Tl的修改被丢失。(2)不可重复读:不可重复读是指事务Tl读取数据后,另一事务执行更新操作,使Tl无法再现前一次读取结果。(3)读“脏”数据:读“脏’数据是指事务Tl修改某一数据,并将其写回磁盘,事务T2读取同一数据后,Tl由于某种原因被撤销,这时Tl已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据。避免不一致性的方法和技术就是并发控制。最常用的技术是封锁技术。也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。11.什么是封锁?基本的封锁类型有几种?试述他们的含义。答:封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。封锁是实现并发控制的一个非常重要的技术。基本的封锁类型有两种:排它锁(简称X锁)和共享锁(简称S锁)。排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。共享锁又称为读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。12.什么是封锁协议?答:在运用X锁和S锁这两种基本封锁,对一定粒度的数据对象加锁时,还需要约定一些规则,例如,应何时申请X锁或S锁、持锁时间、何时释放等,称这些规则为封锁协议。13.如何用封锁机制保证数据的一致性?答:DBMS在对数据进行读、写操作之前首先对该数据执行封锁操作,例如事务Tl在对A进行修改之前先对A执行xock(A),即对A加x锁。这样,当T2请求对A加x锁时就被拒绝,T2只能等待Tl释放A上的锁后才能获得对A的x锁,这时它读到的A是Tl更新后的值,再按此新的A值进行运算。这样就不会丢失Tl的更新。14.什么样的并发调度是正确的调度?答:可串行化的调度是正确的调度。可串行化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行它们时的结果相同,称这种调度策略为可串行化的调度。15.如何保证并行操作的可串行性?答:保证并行操作的可串行性:对任何数据集合进行读写操作之前,事务首先应获得对此数据集合的封锁,在释放一个封锁之前,事务不再获得任何其他封锁。16.不同级别的封锁协议的主要区别是什么?答:三级封锁协议:在运用X锁和S锁对数据对象加锁时,还需要约定一些规则,例如何时申请X锁或S锁、持锁时间、何时释放等。称这些规则为封锁协议。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。【一级封锁协议】一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。使用一级封锁协议可以解决丢失修改问题。在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,它不能保证可重复读和不读“脏”数据。【二级封锁协议】二级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后方可释放S锁。二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。但在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。【三级封锁协议】三级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。上述三级协议的主要区别在于什么操作需要申请封锁,以及何时释放。17.不同封锁协议与系统一致性级别的关系是什么?答:不同的封锁协议对应不同的一致性级别。一级封锁协议可防止丢失修改,并保证事务T是可恢复的。在一级封锁协议中,对读数据是不加S锁的,所以它不能保证可重复读和不读“脏”数据。二级封锁协议除防止了丢失修改,还可进一步防止读脏数据。在二级封锁协议中,由于读完数据后立即释放S锁,所以它不能保证可重复读。在三级封锁协议中,无论是读数据还是写数据都是加长锁,即都要到事务结束时才释放封锁。所以三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。18.试述两段封锁协议的概念。答:所谓两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。1)在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁;2)在释放一个封锁之后,事务不再申请和获得对该数据的封锁。所谓“两段”锁的含义是,事务分为两个阶段,第一阶段是获得封锁,也称为扩展阶段。在这个阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不释放任何锁。第二阶段是释放封锁,也称为收缩阶段。在这个阶段,事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁。19.试证明,若并发事务遵守两段锁协议,则对这些事务的并发调度是可串行化的。证明:首先以两个并发事务Tl和T2为例,存在多个并发事务的情形可以类推。根据可串行化定义可知,事务不可串行化只可能发生在下列两种情况:(l)事务Tl写某个数据对象A,T2读或写A;(2)事务Tl读或写某个数据对象A,T2写A。下面称A为潜在冲突对象。设Tl和T2访问的潜在冲突的公共对象为{A1,A2…,An}。不失一般性,假设这组潜在冲突对象中X=(A1,A2,…,Ai}均符合情况1。Y={Ai+1,…,An}符合所情况(2)。VX∈x,Tl需要XlockX①T2需要Slockx或Xlockx②1)如果操作①先执行,则Tl获得锁,T2等待由于遵守两段锁协议,Tl在成功获得x和Y中全部对象及非潜在冲突对象的锁后,才会释放锁。这时如果存在w∈x或Y,T2已获得w的锁,则出现死锁;否则,Tl在对x、Y中对象全部处理完毕后,T2才能执行。这相当于按Tl、T2的顺序串行执行,根据可串行化定义,Tl和几的调度是可串行化的。2)操作②先执行的情况与(l)对称因此,若并发事务遵守两段锁协议,在不发生死锁的情况下,对这些事务的并发调度一定是可串行化的。证毕。20.举例说明,对并发事务的一个调度是可串行化的,而这些并发事务并不一定遵守两段锁协议。(P109)21.什么是活锁?什么是死锁?答:如果事务Tl封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当Tl释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求……T2有可能永远等待,这就是活锁的情形