zoukankan      html  css  js  c++  java
  • SQL基本语法总结(含SQL代码)

    数据库好比人的大脑的记忆系统,没有了数据库就没有了记忆系统。而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'--本地硬盘路径
       --先把原来的数据库删除,在执行该条语句
  • 相关阅读:
    什么是“开放构造类型”,“封闭构造类型”
    代码整洁整洁之道读书笔记 2
    学习 WCF By Visual Studio 2010 (1)起步“全双工”
    代码整洁整洁之道读书笔记 1
    学习 WCF By Visual Studio 2010 (2) 宿主
    持久层通用组件设计与范例,写给某孩子(基于JDBC)
    [zz]JS后退一页, JS返回上一页代码, JS返回下一页,JS返回第几页,JS页面跳转, JS引用JS
    web下vs2008+crystal report 不预览直接打印
    用SQL语句删除重复记录
    Gridview 添加行.
  • 原文地址:https://www.cnblogs.com/yyzwz/p/13393237.html
Copyright © 2011-2022 走看看