SQL-Server实验讲义
思考: 如果仅执行下述恢复语句,能查看 student 的数据吗?
RESTORE DATABASE school from DISK=’c:\\schoolDiff.bak’WITH file=1 NORECOVERY
Select * from student
三 利用日志备份
1 设置故障还原模型为:完全 2 建立备份
1) 制作数据文件备份 schooldata1.bak
2) 把学号 7003, 姓名:王江,性别:男,年龄为23 的学生加入student 3) 制作日志备份存入 schoollog.bak
4) 把学号 7004, 姓名:赵兰,性别:女,年龄为22 的学生加入student
5) 制作日志备份存入 schoollog.bak
3 观察schoollog中的信息 4 删除 school 数据库
5 利用schooldata1.bak 及 schoollog.bak 恢复数据库 school 到最新状态
四 使用企业管理器练习备份调度策略
1 对数据库 school 每天上午8时进行一次数据库完全备份 2 对数据库 school 的每隔 1分钟备份进行一次差异备份。 3 手工启动两个备份作业 4 删除 school 数据库
5 利用1,2步的备份进行 school的恢复。
思考:如何把备份文件备份到另外一台计算机上。
五 使用企业管理器练习数据库的分离及附加 六 如何清除日志文件。
七 使用企业管理器练习数据库的压缩 八 把school 备份到其他计算机上。
试验十三 事务
目的:1 掌握并理解事务
一 理解 rollback
1在查询分析器输入下列语句并执行 ,记录该学生的年龄。 Select * from student where sno=’0001’ 20
2 执行下列 语句序列A: BEGIN TRANsaction
Update student set sage=sage+1 where sno=’0001’ Select * from student where sno=’0002’
此事务结束了吗? 答:没有
26
SQL-Server实验讲义
3 执行:
Select * from student where sno=’0001’
记录该学生的年龄。
思考:student 中的0001的年龄确实被更改了吗? 为什么? 21
更改了,因为在事务中执行了update语句 4 执行下列语句。
ROLLBACK TRANsaction
然后再执行:
Select * from student where sno=’0001’
, 观察0001的年龄, 解释发生这种现象的原因。
20
Rollback 放弃了事务中所有已执行的语句。
二 理解 commit
1在查询分析器输入下列语句并执行 ,记录该学生的年龄。 Select * from student where sno=’0001’ 20
2 执行下列 语句序列A: BEGIN TRANsaction
Update student set sage=sage+1 where sno=’0001’ Select * from student where sno=’0002’
3执行:
commit transaction
Select * from student where sno=’0001’
记录结果, 此时更改后的数据被永久保存了吗? 21 永久保存
三 执行下列 语句序列 BEGIN TRANsaction
Update student set sage=sage+1 where sno=’0001’
Update sc set grade=grade + 1 where sno=’0002’ and cno=’1001’
Rollback
上述指令执行后,数据库发生了什么变化?
没有
试验十四 锁
目的:1 理解锁的概念及锁的作用
一 利用帮助系统了解Sql-server 的下列语句的含义 1 锁的隔离级别
SET TRANSACTION ISOLATION LEVEL Serializable
27
SQL-Server实验讲义
2 设置锁定超时时间
SET LOCK_TIMEOUT 5000 3 SP_LOCK
二 观察封锁
1 执行语句序列A BEGIN TRANsaction
Update student set sage=sage+1 where sno=’0001’ Select * from student where sno=’0002’
2 在查询分析器中打开第二个连接(连接 school)[文件-连接], 输入下列语句:
1) select * from student where sno=’0002’
记录执行结果,说明原因。
能看到结果,因为在未结束事务中对 student的0002学生加了 S锁,其他事务还可
以对其加 S锁。
2)select * from student where sno=’0001’ 记录执行结果,说明原因。(如上一步没有停止,则强行终止)
不能看到结果,出于等待状态。因为在未结束事务中对 student的0001学生加了 X
锁,其他事务不可以对其加任何锁。
3) update student set sname=’aaa’ where sno=’0002’ 记录执行结果,说明原因。(如上一步没有停止,则强行终止) 不能看到结果,,出于等待状态。因为在未结束事务中对 student的0002学生加了 S
锁,其他事务不可以对其加 X锁。
4) 强行终止上一步的命令,然后执行语句: DBCC opentran
记录结果 ,思考:如何知道此事务是那一台计算机发出的?
5)执行:
select * from student where sno=’0001’ 记录执行结果,说明原因 等待
然后回到第一个连接中,执行语句: commit Tran
观察并记录第二个连接窗口中的现象,说明原因
0001学生的信息马上被显示出来,因为 commit 结束了事务,则其加的锁被释放,因此等待的操作可以枷锁成功了。
三 了解锁的类型 1 执行下列语句
BEGIN TRAN
Select * from student where sno=’0001’ Print ‘server process ID (spid) : ‘ Print @@spid
1) 然后执行下列语句
28
SQL-Server实验讲义
exec sp_lock
注意根据事务中输出的 spid ,观察结果中相应 spid 的记录, 观察加锁。 2) 然后执行下列语句 commit tran exec sp_lock
注意根据事务中输出的 spid ,观察结果中相应 spid 的记录, 观察加锁。
2 执行下列语句
BEGIN TRAN
Update student set sage=sage + 1 where sno=’1001’ Print ‘server process ID (spid) : ‘ Print @@spid
1) 然后执行下列语句 exec sp_lock
注意根据事务中输出的 spid ,观察结果中相应 spid 的记录, 观察加锁。
2) 然后执行下列语句 commit tran exec sp_lock
注意根据事务中输出的 spid ,观察结果中相应 spid 的记录, 观察加锁。
3 使用 SET TRANSACTION ISOLATION LEVEL Serializable 然后重新执行 三和四步,观察与原来有何不同。
4 了解表级锁 ( 查看帮助文件)
BEGIN TRAN
Select * from student (TABLOCKX) where sno=’1002’ Print ‘Server Process ID (spid): ‘ Print @@spid
然后执行:
exec sp_lock
注意根据事务中输出的 spid ,观察结果中相应 spid 的记录, 观察加锁类型。
5 了解锁定超时
a) 执行下列语句 ,设置锁定超时为 1000 ms
set lock_timeout 1000 go
BEGIN TRAN
Select * from student (TABLOCKX) where sno=’1002’
29
SQL-Server实验讲义
2)打开第二个连接 执行:
select * from student
记录观察到的现象。
3)在打开的第二个连接中
set lock_timeout 10000
go
select * from student
记录观察到的现象。
五 编程实例
1 编写存储过程 usp_update1 , 传入参数为课程号,处理逻辑: 对传入的这门课,进行如下处理:
如某学生该门课成绩>80 , 则加 2 分 如某学生该门课成绩>60 , 则加 1 分 如某学生该门课成绩<=60 ,扣1分
要求:在存储过程中,要么全部学生的成绩被处理成功,要么全部不处理
思考:在调试中,采用那些措施,使存储过程运行时执行回滚操作 (rollback) 。
2 编写触发器,
对insert、update语句进行监控,当学生的年龄超过40岁时,把该学生的系科改为 ‘BAK?,同时删除该学生的所有选课记录。(注意,利用事务,使修改系科及删除选课记录要么全做,要么全不做)
30
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库新SQL——SERVER实验练习答案(6)在线全文阅读。
相关推荐: