DECLARE @maleCount INT --男读者数量 DECLARE @femaleCount INT --女读者数量 DECLARE @gender CHAR(2)
DECLARE cMyCURSOR CURSOR FORWARD_ONLY FOR SELECT Gender FROM Patron OPEN cMyCURSOR
SELECT @maleCount = 0 SELECT @femaleCount = 0
FETCH NEXT FROM cMyCURSOR INTO @gender WHILE @@FETCH_STATUS=0 BEGIN
IF @gender='男'
SELECT @maleCount = @maleCount + 1 ELSE
SELECT @femaleCount = @femaleCount + 1 FETCH NEXT FROM cMyCURSOR INTO @gender END
CLOSE cMyCURSOR DEALLOCATE cMyCURSOR
PRINT '男:'+ CAST(@maleCount AS VARCHAR(10))+'女:'+
CAST(@femaleCount AS VARCHAR(10))
第7章 数据库安全性
1.什么是数据库安全性?
参考答案:数据库的安全性,是指保护数据库,防止因用户非法使用数据库造成的数据泄露、更改或破坏。
2.简述存取控制的任务及种类。
参考答案:它确保具有数据库使用权的用户访问数据库,同时令未授权的人员无法接近数据库。存取控制有两种:自主存取控制(Discretionary Access Control)和强制存取控制(Mandatory Access Control)。两者的主要区别是自主存取控制中,同一用户对不同的数据对象具有不同的权限,但是哪些用户对哪些数据对象具有哪些权限并没有固定的限制;而强制存取控制中,每一个数据对象被标以一定的密级,每一个用户也被授予某一权限级别,只有具有一定权限的用户才能访问具有一定密级的数据对象。存取控制机制的任务主要包括两部分:用户的权限定义和合法权限检查,这两部分共同构成了DBMS的安全子系统。
3.简述数据库中常用的安全性控制方法。
参考答案:数据库系统常用的安全性控制方法包括用户标识与鉴别、存取控制、视图、审计和数据加密。
用户标识和鉴别:是系统提供的最外层的安全保护措施。只有在DBMS成功注册的用户才能访问该数据库。其实现方式是系统提供特定的方式让用户标识自己的名字或身份。 存取控制保证任何合法的用户只能执行它有权执行的操作,只能访问他有权访问的数据对象。
视图:可以屏蔽掉一部分需要对某些用户保密的数据,然后,在视图上定义存取权限,将对视图的访问权授予这些用户,而不允许他们直接访问定义视图的基本表,从而自动地对数据提供一定程度的安全保护。
审计:是一种监视措施,就是把用户对数据库的所有操作自动记录下来放入审计日志(Audit Log)中,一旦发生数据被非法存取,DBA可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。
数据加密:是防止数据在存储和传输中失密的有效手段。加密的基本思想是根据一定的算法将原始数据(明文Plain Text)变换为不可直接识别的格式(密文Cipher Text),从而使得不知道解密算法的人无法获得数据的内容。
4.SQL Server的身份验证模式有哪些?在SQL Server Management Studio中完成身份验证模式的查看与修改,并验证修改结果。
参考答案:SQL Server的身份验证模式有两种,Windows身份验证和混合模式。“在SQL Server Management Studio中完成身份验证模式的查看与修改,并验证修改结果”请参考本章相应部分。
5.什么是角色?使用角色管理的优点是什么?SQL Server中的角色可以分为几种? 参考答案:角色是具有一定权限的用户组。角色的使用与Windows组的使用相似。通过角色可以将用户集中到一个组中,然后对组应用权限。可以把某些用户设置成某一角色,
这些用户称为该角色的成员,其成员自动继承该角色的权限。对角色授予或收回权限时,对其中的所有成员都有效。这样,只要对角色进行权限管理就可以实现对属于该角色的所有成员的权限管理,大大减少了工作量。
SQL Server中有两种角色,即服务器角色和数据库角色。 6.权限管理包括哪些内容?由哪些语句来完成权限管理?
参考答案:权限管理包括三部分内容:授权、回收权限和拒绝权限。 授权:授予某些用户对象权限或语句权限,由GRANT语句完成。
回收权限:收回之前授予或已经拒绝的权限。并不妨碍用户或角色从更高级别继承已授予的权限,由REVOKE语句完成。
拒绝权限:拒绝某些用户或者角色使用某些权限,包括删除之前授予用户或角色的权限,停用从其他角色继承的权限,并确保用户或角色不继承更高级别的用户或角色的权限,由DENY语句完成。
权限管理语句:GRANT(授权)、REVOKE(回收权限)、DENY(拒绝权限)。 用T-SQL语句和图形界面两种方式完成习题7-9。
7.创建一个登录账户libfirst,指定他为TSG数据库的用户,并将Book表的录入和删除数据的权限授予他,同时不允许他修改Book表中数据。
参考代码如下:
CREATE LOGIN libfirst WITH PASSWORD='123456', DEFAULT_DATABASE=TSG GRANT INSERT, DELETE ON Book TO libfirst DENY UPDATE ON Book TO tsg_dbrole1
8.在TSG数据库中创建新的用户user1,将对表Book的UPDATE和DELETE权限授予user1(对应登录名libfirst),并允许其继续传播该权限。
参考代码如下:
CREATE USER user1 FOR LOGIN libfirst GRANT UPDATE ON Book TO user1 WITH GRANT OPTION
9.将TSG数据库中Book表的INSERT权限授予Public角色(所有用户),并拒绝Guest拥有该权限。
参考代码如下:
USE TSG GO
GRANT INSERT ON Book TO PUBLIC DENY INSERT ON Book TO Guest
第8章 数据库保护
1.什么是事务?简述事务的特性。
参考答案:事务是一种机制,是一段程序,是一系列的数据库操作构成的集合,在逻辑上是一个不可分割的工作单元。
事务有四个特性:原子性(Atomicity)、一致性(Consistency)、独立性(Islation)和持续性(Durability),简称ACID。
原子性:指事务是一个工作单元,作为一个整体要么都做,要么都不做。 一致性:指事务在完成时,必须使数据库内所有的数据都保持一致性状态。 隔离性:指一个事务的执行不能被其他的事务所干扰,即事务在执行过程中未提交的数据都不能被其他事务所使用,直到事务提交。
持续性:是指事务一旦提交,它对数据库的改变就是永久的,任何故障和应用程序错误都不会影响其对数据库的改变。
2.在TSG数据库的Patron表中,删除读者王东的信息。(要考虑参照完整性) 参考答案:
USE TSG GO
DELETE FROM Lend
WHERE PatronID=(SELECT PatronID FROM Patron WHERE Name='王东') GO
DELETE FROM Patron WHERE Name='王东'
3.什么是封锁?有哪两种基本的锁类型?它们如何工作?
参考答案:封锁是指事务T在对某个数据对象进行操作之前,先向系统发出加锁请求,加锁后事务T就对该数据对象有了一定的控制权,在T释放该锁之前,其他事务不能更新该数据对象。
有两种基本的锁类型:共享锁(Share Locks,简称S锁)和排它锁(Exclusive Locks,简称X锁)。
共享锁又称读锁。如果事务T对数据对象A加上共享锁(S锁),其他事务对A只能再加S锁,不能加X锁,直到事务T释放A上的S锁为止。
排它锁又称写锁。如果事务T对数据对象A加上排它锁(X锁),则只允许T读取和修改A,其他任何事务既不能读取和修改A,也不能再对A加任何类型的锁,直到T释放A上的锁为止。
4.封锁协议有几级?其内容分别是什么?
参考答案:一级封锁协议:事务T在修改数据之前必须先对其加X锁,直到事务结束才释放。这里的事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
二级封锁协议:事务T对要修改数据必须先加X锁,直到事务结束才释放X锁;对要读取的数据必须先加S锁,读完后即可释放S锁。
三级封锁协议:事务T在读取数据之前必须先对其加S锁,在要修改数据之前必须先对其加X锁,直到事务结束后才释放所持有的锁。
5.封锁机制可能产生哪些问题?如何来预防或解决?
参考答案:使用封锁机制后,事务需要锁定要操作的数据库对象,这就有可能产生事务等待,等待的极端情况就是产生活锁和死锁。
当多个事务请求封锁同一数据时,某一事务总是处于等待状态无法获得所需封锁,这种状况就称为活锁。解决活锁问题只需要采用先来先服务的策略即可。
即事务T1和T2都需要锁定被对方已经锁定的数据对象,提出申请后互相等待对方释放锁,两个事务永远无法结束,只能继续等待。此时就产生了死锁。数据库中解决事务的死锁问题主要有两种方法:一种是预防死锁;另一种是检测并解除死锁。预防死锁包括一次封锁和顺序封锁两种方法。检测死锁使用超时法和等待图法。
6.什么是可串行化调度?两段锁协议的内容是什么?
参考答案:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同,这种调度策略为可串行化的调度。
两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁:第一阶段是扩展阶段、第二阶段是收缩阶段。
扩展阶段:这一阶段获得封锁,事务在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁;在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。
收缩阶段:这一阶段是释放封锁,事务可以释放任何数据项上的任何类型的锁,在释放一个封锁之后,事务不再申请和获得任何其他封锁。在这阶段,事务物能够释放封锁,但是不能再申请任何锁。
7.什么是事务的并发操作?发生并发操作时可能产生哪些问题?
参考答案:在多用户和网络环境下,多个用户或应用程序可以同时对数据库进行访问,这种多用户数据库系统同一时刻可能有多个事务在运行,这就是事务的并发性。
并发操作可能导致的问题包括:丢失修改、读“脏”数据和不可重复读。
丢失修改是指两个事务读入同一数据并修改,某一事务提交的结果破坏了另一事务的结果导致其修改丢失。读“脏”数据是指某个事务读取了另一个事务正在修改的数据的中间结果,而这个结果很可能与那个事务修改的最终结果不一致,这样会造成该事务读到的数据就与数据库中的数据不一致。不可重复读是指某一事务读取数据后,而另一事务执行更新操作,使前一事务无法再现前一次读取结果。
8.简述备份的种类及各自的优缺点。
参考答案:备份可以分为海量备份和增量备份:
海量备份是指对数据库进行完整的备份,包括所有的数据以及数据对象。海量备份得到的副本对于恢复数据来说比较方便,但由于是对整个数据库进行备份,所以海量备份速度慢,占用空间也大。增量备份作为海量备份的补充,只备份上次海量备份后更改的数据,因此,增量备份速度比较快。
备份还可以分为静态备份和动态备份:
静态备份是指在系统中无事务运行时进行的备份。静态备份得到的是能够保证数据一