数据库好比人的大脑的记忆系统,没有了数据库就没有了记忆系统。而SQL语言作为数据库的王牌语言,肯定是重中之重。
最近在玩的无论是JAVA的JDBC,还是SSM的mybatis配置,都需要用到SQL代码,所以下定决心重新整理了一遍,把之前敲过的代码重新复习了一遍,在博客上做个备份,方便以后查阅。
下面是大三第一学期《数据库原理》实验的目录,没必要把所有的实验报告都理出来,我把SQL基础的代码放在这里,另外高级部分(存储过程、触发器、游标)额外拿了出来,另外开辟了若干文。
SQL基础 本文(数据库、表、数据的增删改查、视图相关,以及所有实验报告源代码)
游标 (类似C++ 的 指针)
存储过程(类似 C++ 的自定义函数)
触发器 (类似 自定义的陷阱,或者说是监听器,满足某个条件了执行某个方法)
用户权限及权限管理 (类似Windows的多用户管理)
并发控制 (了解多个用户同时对数据造成错误的情况 和 解决方法)
数据恢复(当数据库数据丢失,相应的解决方法)
创建数据库
create database 学生管理系统
on
(
name = stu,
filename = 'D: empdatabasestu.mdf',
size = 10,
maxsize = 50,
filegrowth = 5%
)
log on
(
name = stu_log,
filename = 'D: empdatabasestu.ldf',
size = 5,
filegrowth = 5%,
maxsize = 25
)
更新/删除数据库
//添加文件 stu_data2.mdf
alter database 学生管理系统
add file
(
name = stu_data2,
filename = 'd: empdatabasestu_data2.mdf',
size = 5,
maxsize = 25,
filegrowth = 5
)
//修改文件大小为10
alter database 学生管理系统
modify file
(
name = stu_data2,
filename = 'd: empdatabasestu_data2.mdf',
size = 10
)
//更新逻辑名
alter database 学生管理系统
modify file
(
name = stu_data2,
newname = stu_data3,
filename = 'D: empdatabasestudent_data2.mdf'
)
//更新物理地址
alter database 学生管理系统
modify file
(
name = stu_data3,
filename = 'D: empdatabasestudent_data2.mdf'
)
//删除新加的文件
alter database 学生管理系统
remove file stu_data3
//删除整个数据库
drop database zwz
创建表
use 学生管理系统
create table 院系
(
编号 smallint primary key,
名称 char(20) not null unique,
负责人 char(10),
办公地点 char(20)
)
create table 学生
(
学号 char(8) primary key,
院系 smallint references 院系(编号),
姓名 char(10) not null,
性别 char(2) check (性别 in ('男','女')),
生源 char(6),
状态 char(4) check (状态 in ('正常','留级','休学','退学'))
)
create table 教师
(
教师编号 char(8) primary key,
院系 smallint references 院系(编号),
姓名 char(10) not null,
性别 char(2) check (性别 in ('男','女')),
职称 char(6) check (职称 in ('教授','副教授','讲师','助教')),
专业 char(10)
)
create table 课程
(
课程编号 char(8) primary key,
课程名称 char(20) not null,
负责教师 char(8) references 教师(教师编号),
学时 smallint not null,
课程性质 char(10) check (课程性质 in ('公共基础','专业基础','专业选修','任意选修'))
)
create table 选课
(
学号 char(8) references 学生(学号),
课程编号 char(8) references 课程(课程编号),
成绩 smallint default '' check (成绩 between 0 and 100)
primary key(学号,课程编号)
)
更新/删除表
use 学生管理系统
alter table 学生
add 平均成绩 smallint default ''
alter table 课程
add check (学时 % 8 = 0)
alter table 院系
alter column 负责人 varchar(30) not null
alter table 教师
add 工资 decimal(5,2)
drop table 选课 --删除表
插入数据
use 学生管理系统
insert into 院系(编号,名称,负责人,办公地点) values (1101,'信息与电子系','戈素贞','5-211')
insert into 院系(编号,名称,负责人,办公地点) values (1102,'经济与管理系','杨文兵','6-411')
insert into 院系(编号,名称,负责人,办公地点) values (1103,'外语系','况细林','3-205')
insert into 院系(编号,名称,负责人,办公地点) values (1104,'人文系','','')
insert into 院系(编号,名称,负责人,办公地点) values (1105,'生物科学系','金自学','6-211')
insert into 院系(编号,名称,负责人,办公地点) values (1106,'工程技术系','胡国军','5-311')
insert into 院系(编号,名称) values (1107,'公共基础部')
insert into 院系(编号,名称,负责人,办公地点) values (1108,'网络技术部',default,default)
insert into 学生 values('2000012',1101,'王林','男','浙江','正常')
insert into 学生 values('2000113',1101,'张大民','男','浙江','正常')
insert into 学生 values('2000256',1102,'顾芳','女','浙江','留级')
insert into 学生 values('2000278',1103,'姜凡','男','浙江','正常')
insert into 学生 values('2000014',1104,'葛波','女','浙江','正常')
insert into 教师 values('100001',1102,'叶国灿','男','教授','经济管理')
insert into 教师 values('100002',1105,'金子学','男','教授','环境管理')
insert into 教师 values('100003',1106,'胡国军','男','副教授','工程')
insert into 教师 values('100004',1103,'况细林','男','副教授','英语')
insert into 课程 values('1128','高等数学',null,6,'公共基础')
insert into 课程 values('1156','英语',100003,6,'公共基础')
insert into 课程 values('1137','管理学',100001,6,'专业基础')
insert into 课程 values('1124','数据库原理',null,4,'专业基础')
insert into 课程 values('1136','离散数学',null,4,'专业基础')
insert into 选课 values('2000012','1156',80)
insert into 选课 values('2000113','1156',89)
insert into 选课 values('2000256','1156',93)
insert into 选课 values('2000014','1156',88)
insert into 选课 values('2000256','1137',77)
单表查询数据
select 课程名称,学时 from 课程
select distinct 课程名称,学时 from 课程
select * from 课程
select 课程名称, 学时 from 课程
where 学时 = 4;
select 课程名称, 学时 from 课程
where 学时 = 4 and 课程名称 = '数据库原理';
select 课程名称, 学时 from 课程
where 学时 = 4 or 学时 = 6;
select 课程名称, 学时 from 课程
where 学时 = 4 and 课程名称 = '数据库原理'or 学时 = 6;
select 课程名称, 学时 from 课程
where 学时 between 4 and 5;
select 课程名称, 学时 from 课程
where 学时 not between 4 and 5;
select 课程名称, 学时 from 课程
where 课程名称 like '%学';
select 课程名称, 负责教师 from 课程
where 负责教师 is null;
select 学号,课程编号,成绩 from 选课
order by 成绩 desc;
select 学号,课程编号,成绩 from 选课
order by 成绩;
select top 3 学号,课程编号,成绩 from 选课
order by 成绩;
select top 3 with ties 学号,课程编号,成绩 from 选课
order by 成绩 desc;
多表查询
select * from 学生,院系
where 学生.院系 = 院系.编号;
select * from 学生,院系
where 学生.院系 = 院系.编号
and 性别 = '男';
select * from 学生,院系
where 学生.院系 = 院系.编号
and 性别 = '男' and 学号='2000012';
select *
from 选课 cross join 学生
select *
from 选课 cross join 学生
where 选课.学号 = 学生.学号
select 姓名,职称,课程名称,课程性质
from 教师 inner join 课程
on 教师.教师编号 = 课程.负责教师
select 姓名,职称,课程名称,课程性质
from 教师 left join 课程
on 教师.教师编号 = 课程.负责教师
select 姓名,职称,课程名称,课程性质
from 教师 right join 课程
on 教师.教师编号 = 课程.负责教师
select 姓名,职称,课程名称,课程性质
from 教师 fulljoin 课程
on 教师.教师编号 = 课程.负责教师
复合查询
1.使用IN运算的简单嵌套查询
select 姓名,院系,职称 from 教师
where 院系 in(
select 编号 from 院系
where 名称 = '经济与管理系' or 名称 = '信息与电子系'
)
2.使用NOT IN运算的简单嵌套查询
select 姓名,院系,职称 from 教师
where 院系 not in(
select 编号 from 院系
where 名称 = '经济与管理系' or 名称 = '信息与电子系'
)
3.使用关系运算(如等于)的简单嵌套查询
select 姓名,院系,职称 from 教师
where 院系 =(
select 编号 from 院系
where 名称 = '经济与管理系'
)
④ 使用ANY或SOME的简单嵌套查询
select 学号,课程编号,成绩 from 选课
where 成绩 > ALL(
select 成绩 from 选课
where 学号 = 2000012
)
⑤ 使用ALL的简单嵌套查询
select 学号,课程编号,成绩 from 选课
where 成绩 > ANY(
select 成绩 from 选课
where 学号 = 2000012
)
⑥ 查询院系名称含“计算机”、职称为教授、所负责课程为必修课的老师姓名、
职称、课程名称和课程学时等信息(分别用嵌套查询和连接查询完成,分析各自的效率)。
select 姓名 from 教师 full join 课程 on
教师.教师编号 = 课程.负责教师 full join 院系
on 教师.院系 = 院系.编号
where (专业 = '专业基础' or 专业 = '公共基础' )and 职称 = '教授'
and 院系.名称 like '%计算机%'
⑦ 设计两个内外层互相关的嵌套查询。
select 姓名 from 教师
where 姓名 =
(
select 姓名 from 教师
where 姓名 = '叶国灿'
)
⑧ 使用EXISTS的嵌套查询。
select * from 学生
where exists
(
select * from 选课
where 选课.学号 = 学生.学号
)
⑨ 使用NOT EXISTS 的嵌套查询。
select * from 学生
where not exists
(
select * from 选课
where 选课.学号 = 学生.学号
)
select count(学号)as 参与选课人数
from 选课
select sum(成绩)as 总成绩
from 选课
select count(学号)as 计数 ,sum(成绩)as 求和 ,avg(成绩) as 平均
from 选课
(select * from 学生
where 学号 = (
select 学号 from 选课
where 成绩 =
(select max(成绩) from 选课)
)
)
intersect
(
select * from 学生
where 学号 = (
select 学号 from 选课
where 成绩 > 70
and 课程编号 =
(
select 课程编号 from 课程
where 课程名称 = '数据库原理'
)
)
)
⑤ 查询每个学生的平均成绩。
select 学生.姓名 ,avg(选课.成绩) as 平均成绩
from 选课,学生
group by 学生.学号,学生.姓名
⑥ 查询每个学生的所有课程的最高成绩、最低成绩、平均成绩和所考课程的门数。
select 学号,
max(成绩) as 最高成绩,min(成绩) as 最低成绩 ,
avg(成绩) as 平均成绩,count(课程编号) as 所考门数
from 选课
group by 选课.学号
⑦ 查询至少有10门必修课程考试成绩的每个学生的平均成绩
select 学生.姓名 ,avg(选课.成绩) as 平均成绩
from 选课,学生
group by 学生.学号,学生.姓名
having count(课程编号) > 10
⑧ 设计2个使用COMPUTE…BY 和COMPUTE的查询
select 学号,成绩 from 选课
group by 学号
compute sum(成绩) by 学号
//----
select 学号,成绩 from 选课
group by 学号
compute sum(成绩)
//----
(
select 学号,成绩 from 选课
group by 学号
compute sum(成绩) by 学号
)
union
(
select 学号,成绩 from 选课
group by 学号
compute sum(成绩)
)
//----
(
select 学号,成绩 from 选课
group by 学号
compute avg(成绩) by 学号
)
union
(
select 学号,成绩 from 选课
group by 学号
compute avg(成绩)
)
//----
视图查询
create view v1 as
select 学号,姓名,性别
from 学生
create view v2 as
select *
from 学生
where 性别 = '男'
create view v3 as
select 学号,姓名,性别
from 学生
where 性别 = '男'
create view v4 as
select 学号,姓名,性别,名称
from 学生,院系
where 学生.院系 = 院系.编号
create view v5 as
select *
from 学生
where 院系 not in
(
select 编号
from 院系
where 名称 = '外语系'
)
create view v6 as
select b.学号,b.姓名,b.院系
from 学生 as a , 学生 as b
where a.姓名 = '王林' and a.院系 = b.院系
select * from v1
select v1.学号,v1.姓名
from v1 join v2
on v1.学号 = v2.学号
insert into v6 values('200000','张三',1102)
update 学生
set 学生.状态 = '不对'
where 学生.姓名 = '王林'
update 学生
set 学生.状态 = '留级'
where 学生.姓名 = '王林'
delete 学生
where 学生.姓名 = '张三'
游标
/*1.声明游标*/
declare youbiao cursor scroll
for select 学生.学号,姓名,院系.名称,课程.课程名称,选课.成绩 from 学生,院系,选课,课程
where 学生.院系 = 院系.编号 and 选课.学号 = 学生.学号 and 课程.课程编号 = 选课.课程编号
order by 学生.学号;
/*2.打开游标*/
open youbiao
/*3.声明游标提取数据所要存放的变量*/
declare @numId char(8),@nameId char(10),@yuanxiname char(20) ,@classname char(20),@grade char(20)
/*4.定位游标到哪一行*/
fetch First from youbiao into @numId, @nameId, @yuanxiname,@classname,@grade
while @@fetch_status = 0
begin
print char(23)
print '学 号: ' + @numId +'姓 名: ' + @nameId+ '院系名称: '
+ @yuanxiname + '课程名称: ' + @classname+ '成 绩: ' + @grade
fetch next from youbiao into @numId, @nameId, @yuanxiname,@classname,@grade
end
/*关闭游标 释放*/
close youbiao
deallocate youbiao
存储过程
//////////////////分割线1.1////////////////////
create procedure aaa
@s smallint,
@e smallint
as
select 学生.学号,学生.姓名,
院系.名称 as 院系名称,avg(选课.成绩) as 平均成绩
from 学生,选课,院系
where 学生.学号 = 选课.学号 and 学生.院系 = 院系.编号
group by 学生.学号,学生.姓名,院系.名称
having avg(选课.成绩) between @s and @e;
go
exec aaa 80,88;
drop procedure aaa
//////////////////分割线1.2////////////////////
create procedure new_data
@sno char(8),
@cno char(8),
@grade smallint
as
if(@sno is not null and @cno is not null)
begin
update 选课 set 成绩 = @grade
where 选课.学号 = @sno and 选课.课程编号 = @cno;
select 选课.学号,avg(选课.成绩) as 平均成绩
from 选课
where 选课.学号 = @sno
group by 选课.学号;
end
go
exec new_data '2000278','1156',99;
drop procedure new_data
//////////////////分割线2.1////////////////////
create procedure new_find
@sno char(8)
as
if(@sno is not null)
begin
select 学生.学号,学生.姓名,学生.性别,学生.生源,院系.名称,学生.状态
from 学生,院系
where 学生.院系 = 院系.编号 and 学生.学号 = @sno
end
go
exec new_find '2000012'
drop procedure new_find
//////////////////分割线2.2////////////////////
create procedure new_class
@cno char(8),
@cname char(20),
@ctea char(8),
@time smallint,
@xz char(10)
as
if(@cno is not null)
begin
insert 课程 values('1000','不知名的高级课程','100001',2,'专业基础');
end
go
exec new_class '1000','不知名的高级课程','100001',2,'专业基础'
drop procedure new_class
//////////////////分割线3.1////////////////////
select 学生.学号,学生.姓名,学生.性别,学生.生源,院系.名称,学生.状态
from 学生,院系
where 学生.院系 = 院系.编号 and 学生.学号 = '2000012'
//////////////////分割线以下是课外部分////////////////////
create procedure aaa
as
select *
from 课程;
go
exec aaa
drop procedure aaa
//////////////////分割线////////////////////
create procedure aaa
@a int,
@b int
as
set @a = @a + @b;
return @a;
go
declare @ans int;
exec @ans = aaa 1,2;
print @ans;
drop procedure aaa
//////////////////分割线////////////////////
create procedure aaa
as
select *
from 课程;
go
exec aaa;
drop procedure aaa
//////////////////分割线////////////////////
触发器
----------------------------------------------------------------------------------------------------------------------
--第一题
create trigger zwzdecfq
on 选课
for insert
as
declare @sum int,
@id char(10)
select @id = 学号 from inserted
if @id is not null
begin
select @sum=(select count(*)from 选课 where 成绩 <60 and 学号= @id)
if @sum>=5
begin
raiserror('不及格达到5门',16,10)
end
end
--drop trigger zwzdecfq
insert into 选课 values('2000012','1124','50')
insert into 选课 values('2000012','1128','50')
insert into 选课 values('2000012','1136','50')
insert into 选课 values('2000012','1137','50')
insert into 选课 values('2000012','1188','50')
insert into 选课 values('2000012','1189','50')
----------------------------------------------------------------------------------------------------------------------
--第一部分 插入
--2.1.1先插入一行教师数据
insert into 教师 values('100005',1102,'zzz','男','讲师','视听说')
--2.1.2创建触发器
create trigger zwzdecfq02
on 课程
for insert
as
declare @id char(8),@xingzhi char(10),@zc char(6),@jiaoshi char(8)
select @id = 课程编号,@jiaoshi = 负责教师,@xingzhi = 课程性质 from inserted
if @id is not null
begin
select @zc = 职称 from 教师 where 教师编号 = @jiaoshi
if @zc !='教授 'and @zc !='副教授 ' and @xingzhi = '专业基础'
begin
raiserror('专业基础课的教师必须为教授或副教授',11,11)
rollback transaction
end
end
--2.1.3 尝试插入数据
insert into 课程 values('1191','未知课程04','100005',4,'任意选修')
insert into 课程 values('1190','未知课程03','100005',4,'专业基础')
--2.1.4备用代码
delete 课程 where 课程编号 = '1191'
delete 课程 where 课程编号 = '1190'
drop trigger zwzdecfq02
----------------------------------------------------------------------------------------------------------------------
第二部分 更新
create trigger zwzdecfq03
on 课程
for update
as
declare @id char(8),@xingzhi char(10),@zc char(6),@jiaoshi char(8)
select @id = 课程编号,@jiaoshi = 负责教师,@xingzhi = 课程性质 from inserted
if @id is not null
begin
select @zc = 职称 from 教师 where 教师编号 = @jiaoshi
if @zc !='教授 'and @zc !='副教授 ' and @xingzhi = '专业基础'
begin
raiserror('专业基础课的教师必须为教授或副教授',11,11)
rollback transaction
end
end
update 课程 set 课程性质 = '专业基础' where 负责教师 = '100005'
----------------------------------------------------------------------------------------------------------------------
第3.1题:
create trigger zwzdecfq04
on 学生
for insert
as
declare @id char(8),@home char(6)
select @id = 学号 , @home = 生源 from inserted
if @id is not null
begin
if @home != '浙江'
begin
raiserror('您不是浙江人',16,10)
rollback transaction
end
end
--drop trigger zwzdecfq04
insert into 学生 values('2000013',1102,'张三','男','河南','正常')
----------------------------------------------------------------------------------------------------------------------
3.2题
create trigger zwzdecfq05
on 院系
for insert
as
declare @id smallint,@name char(20)
select @id = 编号 , @name = 名称 from inserted
if @id is not null
begin
if @name not like '%系' and @name not like '%部'
begin
raiserror('院系名称输入错误',16,10)
rollback transaction
end
end
--drop trigger zwzdecfq05
insert into 院系 values('1109','吾展书院','马云','88-888')
insert into 院系 values('1111','万达系','王健林','99-999')
----------------------------------------------------------------------------------------------------------------------
3.3题
create trigger zwzdecfq07
on 学生
for insert
as
declare @id char(8),@zt char(4)
select @id = 学号 , @zt = 状态 from inserted
if @id is not null
begin
if @zt != '正常'
begin
raiserror('您不正常',16,10)
rollback transaction
end
end
insert into 学生 values('2000112',1102,'王五','男','浙江','正常')
insert into 学生 values('2000111',1102,'李四','男','浙江','留级')
用户权限
--1.1 创建登入用户
exec sp_addlogin @loginame = 'zwz01',@passwd = '123456',@defdb = '学生管理系统' --服务器主体 zwz01
exec sp_addlogin @loginame = 'zwz02',@passwd = '123456',@defdb = '学生管理系统' --服务器主体 zwz02
exec sp_addlogin @loginame = 'zwz03',@passwd = '123456',@defdb = '学生管理系统' --服务器主体 zwz03
--exec sp_droplogin @loginame = 'zwz01'
--exec sp_droplogin @loginame = 'zwz02'
--exec sp_droplogin @loginame = 'zwz03'
--1.3 建立一个权限为管理员的登入用户 即将zwz01用户加入 sysadmin 服务器角色
exec sp_addsrvrolemember @loginame = 'zwz01',@rolename = 'sysadmin'
--2.1 根据已有的注册用户建立几个当前数据库的用户
exec sp_addrole @rolename = 'zwzdatabase1',@ownername = 'db_datareader'
--上方代码为 建立只读数据库角色 zwzdatabase1
exec sp_addrole @rolename = 'zwzdatabase2',@ownername = 'db_datareader'
--上方代码为 建立只读数据库角色 zwzdatabase2
--exec sp_droprole 'zwzdatabase1'
--exec sp_droprole 'zwzdatabase2'
create user zwz01 --创建数据库用户zwz01
create user zwz02 --创建数据库用户zwz02
--drop user zwz01
--drop user zwz02
exec sp_addrolemember @rolename = 'zwzdatabase1',@membername = 'zwz01'
--上方代码为 把数据库角色 zwzdatabase1 添加数据库用户 zwz01
exec sp_addrolemember @rolename = 'zwzdatabase2',@membername = 'zwz02'
--上方代码为 把数据库角色 zwzdatabase2 添加数据库用户 zwz02
--exec sp_droprolemember @rolename = 'zwzdatabase1',@membername = 'zwz01'
--exec sp_droprolemember @rolename = 'zwzdatabase2',@membername = 'zwz02'
--2.4 授权zwz01可以创建表
grant create table to zwz01
--2.5 查看其他用户
exec sp_helprolemember @rolename = 'zwzdatabase1'
--上方代码为 查看数据库角色 zwzdatabase1的用户列表
grant select,update,insert,delete on 学生 to zwz01 with grant option
--上方代码为 授予zwz01用户 学生表的查询增删改和转授 权限
--3.1 每个用户有建立对像的权限,各自建立自已的对象
exec sp_addlogin @loginame = 'user01',@passwd = '123456',@defdb = '学生管理系统'
exec sp_addlogin @loginame = 'user02',@passwd = '123456',@defdb = '学生管理系统'
exec sp_addlogin @loginame = 'user03',@passwd = '123456',@defdb = '学生管理系统'
create user user01 --创建数据库用户user01
create user user02 --创建数据库用户user02
create user user03 --创建数据库用户user03
grant select,update,insert,delete on user01table to user01 with grant option
grant select,update,insert,delete on user02table to user02 with grant option
grant select,update,insert,delete on user03table to user03 with grant option
exec sp_addrole @rolename = 'user',@ownername = 'db_ddladmin' --建立能操作对象的数据库角色user
exec sp_addrolemember @rolename = 'user',@membername = 'user01' --把数据库角色 user 添加数据库用户user01 即只能操作对象
exec sp_addrolemember @rolename = 'user',@membername = 'user02' --把数据库角色 user 添加数据库用户user02 即只能操作对象
exec sp_addrolemember @rolename = 'user',@membername = 'user03' --把数据库角色 user 添加数据库用户user03 即只能操作对象
create table user01table
(
aa int primary key,
bb int,
cc int
)
create table user02table
(
aa int primary key,
bb int,
cc int
)
create table user03table
(
aa int primary key,
bb int,
cc int
)
--user01
insert user01table values(1,2,3)
select * from user01table
grant select,update,insert,delete on user01table to user02 with grant option
--user02
select * from user01table
select * from user02table
select * from user03table
--user01
revoke grant option for select on user01table from user02 cascade
并发控制
脏读
窗口1:
begin transaction zwz1
update 课程 set 学时 = 8 where 课程编号 = '1128'
waitfor delay '00:00:20'
rollback tran zwz1
select * from 课程 where 课程编号 = '1128'
窗口2:
select * from 课程 with (nolock) where 课程编号 = '1128'
waitfor delay '00:00:20'
select * from 课程 where 课程编号 = '1128'
封锁:set transaction isolation level read committed
/******************************************************************************/
不可重复读:
窗口1:
begin transaction zwz2
select 学时 from 课程 where 课程编号 = '1128'
waitfor delay '00:00:05'
select 学时 from 课程 where 课程编号 = '1128'
commit transaction zwz2
窗口2:
begin transaction zwz3
update 课程 set 学时 = 8 where 课程编号 = '1128'
commit transaction zwz3
封锁:set transaction isolation level repeatable read
/******************************************************************************/
丢失更新:
查询1:
begin transaction zwz4
update 课程 set 学时 = 8 where 课程编号 = '1128'
waitfor delay '00:00:05'
select 学时 from 课程 where 课程编号 = '1128'
commit transaction zwz4
查询2:
begin transaction zwz5
update 课程 set 学时 = 10 where 课程编号 = '1128'
waitfor delay '00:00:05'
select 学时 from 课程 where 课程编号 = '1128'
commit transaction zwz5
封锁:set transaction isolation level repeatable read
/******************************************************************************/
死锁:
查询1:
begin transaction zwz6
update 课程 set 学时 = 8 where 课程编号 = '1136'
waitfor delay '00:00:05'
update 课程 set 学时 = 8 where 课程编号 = '1128'
commit transaction zwz6
查询2:
begin transaction zwz7
update 课程 set 学时 = 8 where 课程编号 = '1128'
waitfor delay '00:00:05'
update 课程 set 学时 = 8 where 课程编号 = '1136'
commit transaction zwz7
调换后(相同顺序法)
查询1:
begin transaction zwz6
update 课程 set 学时 = 8 where 课程编号 = '1136'
waitfor delay '00:00:05'
update 课程 set 学时 = 8 where 课程编号 = '1128'
commit transaction zwz6
查询2:
begin transaction zwz7
update 课程 set 学时 = 8 where 课程编号 = '1136'
waitfor delay '00:00:05'
update 课程 set 学时 = 8 where 课程编号 = '1128'
commit transaction zwz7
数据恢复
--完整备份(包括数据data和日志log)
Backup Database 学生管理系统
To disk='D: empSQL Serverzwz.bak'--文件夹一定要存在
--差异备份(包含数据data和日志log)
Backup Database 学生管理系统
To disk='D: empSQL Serverzwz.bak'
with Differential
--还原数据库
RESTORE DATABASE 学生管理系统 --所被恢复的数据库名称
FROM disk = 'D: empSQL Serverzwz.bak'--本地硬盘路径
--先把原来的数据库删除,在执行该条语句