目录
实验一、数据对象的定义
实验内容及步骤:
一、用SQL 定义语句创建符合如下条件的数据库
数据库名为:学生数据库,模式:默认模式
数据文件的物理文件名为:主数据文件 Students_data.mdf(逻辑文件同名),日志文件:Students_log.ldf(逻辑文件同名),存放在D:\Data 文件夹下(若D:盘中无此文件夹,请先建立此文件夹,然后再创建数据库。)这边我放在E盘上了。
create database "学生数据库"
on primary
(
name=Students_data,
filename='E:\Data\Students_data.mdf',
size=10MB,
filegrowth=10%,
maxsize=UNLIMITED
)
log on
(
name=Students_log,
filename='E:\Data\Students_log.ldf',
maxsize=10MB,
filegrowth=1MB
)
二、选用已建立的“学生数据库”,用 SQL 定义语句创建符合如下条件的表 C-1 到 C-4(注意各种完整性约束)
上述两题,界面方式或命令方式均需要熟练掌握(界面方式很简单,我只操作命令形式的哈)
表C-1 Student表结构
列名 | 说明 | 数据类型 | 约束 |
Sno | 学号 | 普通编码定长字符串,长度为7 | 主键 |
Sname | 姓名 | 普通编码定长字符串,长度为10 |
|
Ssex | 性别 | 普通编码定长字符串,长度为2 |
|
Sage | 年龄 | 微整型(tinyint) |
|
Sdept | 所在系 | 普通编码不定长字符串,长度为20 |
|
Sid | 身份证号 | 普通编码定长字符串,长度为10 |
|
Sdate | 入学日期 | 日期 |
|
表C-2 Course表结构
列名 | 说明 | 数据类型 | 约束 |
Cno | 课程号 | 普通编码定长字符串,长度为10 | 主键 |
Cname | 课程名 | 普通编码不定长字符串,长度为20 |
|
Credit | 学分 | 整型 |
|
Semester | 学期 | 小整型 |
|
表C-3 SC表结构
列名 | 说明 | 数据类型 | 约束 |
Sno | 学号 | 普通编码定长字符串,长度为7 | 主键,引用Student的外键 |
Cno | 课程号 | 普通编码定长字符串,长度为10 | 主键,引用Course的外键 |
Grade | 成绩 | 小整型 |
|
表C-4 Teacher表结构
列名 | 说明 | 数据类型 | 约束 |
Tno | 教师号 | 普通编码定长字符串,长度为8 |
|
Tname | 教师名 | 普通编码定长字符串,长度为10 |
|
Salary | 工资 | 定点小数,小数点前4位,小数点后2位 |
|
use 学生数据库
create table Student(
Sno char(7) primary key,
Sname char(10),
Sex char(2),
Sage tinyint,
Sdept varchar(20),
Sid char(10),
Sdate date);
create table Course(
Cno char(10) primary key,
Cname varchar(20),
Credit int,
Semester smallint
);
create table SC(
Sno char(7),
Cno char(10),
Grade smallint,
primary key(Sno,Cno),
foreign key(Sno) references Student(Sno),
foreign key(Cno) references Course(Cno)
);
create table Teacher(
Tno char(8) not null,
Tname char(10),
Salary float(2)
);
三、写出实现如下功能的SQL语句,并执行所写代码,查看执行结果。
(1) 在Teacher表中添加一个职称列,列名为:Title,类型为nchar(4)。
alter table Teacher add Title nchar(4);
(2) 将Course表中Credit列的类型改为:tinyint。
alter table Course alter column Credit tinyint;
(3) 删除Student表中的Sid和Sdate列。
alter table Student drop column Sid,Sdate;
(4) 为Teacher表添加主键约束,其主键为:Tno。
alter table Teacher add primary key(Tno);
四、按照要求录入数据
录入数据时请务必保证数据格式与定义的数据类型一致,否则会报错(还是通过SQL语句哈,其实图形操作也方便)。
学号 | 姓名 | 性别 | 年龄 | 系别 | 身份证号 | 入学日期 |
0811101 | 李勇 | 男 | 21 | 计算机系 |
|
|
0811102 | 刘晨 | 男 | 20 | 计算机系 |
|
|
0811103 | 王敏 | 女 | 20 | 计算机系 |
|
|
0811104 | 张小红 | 女 | 19 | 计算机系 |
|
|
0821101 | 张立 | 男 | 20 | 信息管理系 |
|
|
0821102 | 吴宾 | 女 | 19 | 信息管理系 |
|
|
0821103 | 张海 | 男 | 20 | 信息管理系 |
|
|
0831101 | 钱小平 | 女 | 21 | 通信工程系 |
|
|
0831102 | 王大力 | 男 | 20 | 通信工程系 |
|
|
0831103 | 张姗姗 | 女 | 19 | 通信工程系 |
|
|
表C-2 Course表中的记录
Cno | Cname | Credit | Semester |
C001 | 高等数学 | 4 | 1 |
C002 | 大学英语 | 3 | 1 |
C003 | 大学英语 | 3 | 2 |
C004 | 计算机文化学 | 2 | 2 |
C005 | VB | 2 | 3 |
C006 | 数据库基础 | 4 | 5 |
C007 | 数据结构 | 4 | 4 |
C008 | 计算机网络 | 4 | 4 |
表C-3 SC表中的记录
Sno | Cno | Grade |
0811101 | C001 | 96 |
0811101 | C002 | 80 |
0811101 | C003 | 84 |
0811101 | C005 | 62 |
0811102 | C001 | 92 |
0811102 | C002 | 90 |
0811102 | C004 | 84 |
0821102 | C001 | 76 |
0821102 | C004 | 86 |
0821102 | C005 | 73 |
0821102 | C007 | NULL |
0821103 | C001 | 50 |
0821103 | C004 | 80 |
0831101 | C001 | 50 |
0831101 | C004 | 80 |
0831102 | C007 | NULL |
0831103 | C004 | 78 |
0831103 | C005 | 65 |
0831103 | C007 | NULL |
表C-4 Teacher表中的记录
Tno | Tname | Salary |
T001 | 张美霞 | 5000 |
T002 | 王洪林 | 5500 |
T003 | 李丽芬 | 4800 |
T004 | 周良水 | 6000 |
T005 | 吴翔 | 700 |
在SQLServer中,当设计(修改)表结构之后,再用SQL语句时,列名会显示无效,但执行可以通过。原因是SQL Server的intellisense(智能感知功能)需要重新整理一下,用快捷键Ctrl+Shift+R即可。插入数据后出现“行受到影响”属于正常情况,不用担心。
INSERT INTO Student (Sno,Sname,Sex,Sage,Sdept) VALUES
('0811101','李勇','男',21,'计算机系'),
('0811102','刘晨','男',20,'计算机系'),
('0811103','王敏','女',20,'计算机系'),
('0811104','张小红','女',19,'计算机系'),
('0821101','张立','男',20,'信息管理系'),
('0821102','吴宾','女',19,'信息管理系'),
('0821103','张海','男',20,'信息管理系'),
('0831101','钱小平','男',21,'信息管理系'),
('0831102','王大力','女',20,'计算机系'),
('0831103','张姗姗','男',19,'计算机系');
INSERT INTO Course(Cno,Cname,Credit,Semester) VALUES
('C001','高等数学',4,1),
('C002','大学英语',3,1),
('C003','大学英语',3,2),
('C004','计算机文化学',2,2),
('C005','VB',2,3),
('C006','数据库基础',4,5),
('C007','数据结构',4,4),
('C008','计算机网络',4,4);
INSERT INTO SC(Sno,Cno,Grade) VALUES
('0811101','C001',96),
('0811101','C002',80),
('0811101','C003',84),
('0811101','C005',62),
('0811102','C001',92),
('0811102','C002',90),
('0811102','C004',84),
('0821102','C001',76),
('0821102','C004',86),
('0821102','C005',73),
('0821102','C007',NULL),
('0821103','C001',50),
('0821103','C004',80),
('0831101','C001',50),
('0831101','C004',80),
('0831102','C007',NULL),
('0831103','C004',78),
('0831103','C005',65),
('0831103','C007',NULL);
INSERT INTO Teacher(Tno,Tname,Salary) VALUES
('T001','张美霞',5000),
('T002','王洪林',5500),
('T003','李丽芬',4800),
('T004','周良水',6000),
('T005','吴翔',7000);
实验二:数据查询(一)
一、实验目的
掌握SQL程序设计基本规范,熟练运用SQL语言实现数据基本查询,包括单表查询、分组统计查询和连接查询等。
二、实验内容和要求
1. 查询SC表中的全部数据。
select * from SC;
2. 查询计算机系学生的姓名和年龄。
select Sname,Sage from Student where Sdept='计算机系';
3. 查询成绩在70~80分的学生的学号、课程号和成绩。
select Sno,Cno,Grade from SC where Grade between 70 and 80;
4. 查询计算机系年龄在18~20岁的男生姓名和年龄。
select Sname,Sage from Student where Sdept='计算机系' and Sex='男' and Sage between 18 and 20;
5. 查询C001课程的最高分。
select MAX(Grade) from SC where Cno ='C001';
6. 查询计算机系学生的最大年龄和最小年龄。
select MAX(Sage) as max_age,MIN(Sage) as min_age from Student where Sdept='计算机系';
7. 统计每个系的学生人数。
select Sdept,COUNT(*) '总人数' from Student group by Sdept;
8. 统计每门课程的选课人数和最高成绩。
select Cno ,COUNT(*) ,MAX(Grade) from SC group by Cno;
9. 统计每个学生的选课门数和考试总成绩,并按选课门数升序显示结果。
select COUNT(Cno),SUM(Grade) from SC group by Sno order by 1 ;
10. 列出总成绩超过200的学生的学号和总成绩。
select Sno,sum(Grade) from SC group by Sno having SUM(Grade)>200;
11. 查询选了C002课程的学生姓名和所在系。
select Student.Sname,Sdept from Student,SC where SC.Cno='C002';
12. 查询考试成绩80分以上的学生姓名、课程号和成绩,并按成绩降序排列结果。
select Student.Sname,SC.Cno,SC.Grade from Student,SC where Grade>80 order by Grade desc;
13. 查询与VB在同一学期开设的课程的课程名和开课学期。
select Cname,Semester from Course where Semester=(select Semester from Course where Cname ='VB') and Cname != 'VB' ;
14. 查询与李勇年龄相同的学生的姓名、所在系和年龄。
select Sname,Sdept,Sage from Student where Sage =(select Sage from Student where Sname ='李勇' )and Sname !='李勇';
15. 查询哪些课程没有学生选修,列出课程号和课程名。
select Course.Cno,Course.Cname from Course LEFT JOIN SC on SC.Cno=Course.Cno where SC.Cno IS NULL
16. 查询每个学生的选课情况,包括未选课的学生,列出学生的学号、姓名、选的课程号。
select Student.Sno,Student.Sname,Cno from Student LEFT JOIN SC on SC.Sno=Student.Sno
17. 查询计算机系哪些学生没有选课,列出学生姓名。
select Sname from Student where Sdept='计算机系' and Sno not in (select SC.Sno from SC);
18. 查询计算机系年龄最大的三个学生的姓名和年龄。top 3
select top 3 Sname,Sage from Student where Sdept='计算机系' order by Sage desc;
19. 列出“VB”课程考试成绩前三名的学生的学号、姓名、所在系和VB成绩。top3
select top 3 Student.Sno,Sname,Sdept,Grade from Student,SC,Course where Cname='VB' order by Grade desc;
20. 查询选课门数最多的前2位学生,列出学号和选课门数。 top 2
select top 2 Sno,COUNT(Cno)'选课门数' from SC group by Sno order by 2 desc;
实验三:数据查询(二)、数据更新数据库
1.掌握SQL嵌套查询和集合查询等各种高级查询的设计方法。
2.熟悉数据库的数据更新操作,能够使用SQL语句对数据库进行数据的插入、修改、删除操作。
1. 用子查询实现如下查询:
(1)查询选了“C001”课程的学生姓名和所在系。
SELECT Sname,Sdept FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno='C001')
(2)查询通信工程系成绩80分以上的学生的学号和姓名。
select Sno,Sname from Student where Sdept='通信工程系' and Sno in(select Sno from SC where Grade>=80);
(3)查询计算机系考试成绩最高的学生的姓名。
select Sname from Student,SC where Student.Sno=SC.Sno and Sdept='计算机系' and Grade in (select MAX(Grade) from SC,student where SC.Sno=Student.Sno and Sdept='计算机系');
(4)查询年龄最大的男生的姓名、所在系和年龄。
select Sname,Sdept,Sage from Student where sex='男' and Sage >=(select MAX(Sage) from Student where Sex='男');
2. 查询C001课程的考试成绩高于该课程平均成绩的学生的学号和成绩。
select Sno,Grade from SC where Cno='C001' and Grade>(select AVG(Grade) from SC where Cno='C003');
3. 查询计算机系学生考试成绩高于计算机系学生平均成绩的学生的姓名、考试的课程名和考试成绩。
select Sname,Cname,Grade from Student,SC,Course where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Grade>(select AVG(Grade) from SC,Student where Sdept='计算机系') and Sdept='计算机系';
4. 查询VB课程考试成绩高于VB平均成绩的学生姓名和VB成绩。
select Sname,Grade from Student,SC,Course where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Cname='VB' and Grade>(select AVG(Grade) from SC,Course where SC.Cno=Course.Cno and Cname='VB');
5. 查询没选VB的学生姓名和所在系。
select Sname,Sdept from Student where Sno not in(select Sno from SC,Course where SC.Cno=Course.Cno and Cname='VB')
6. 查询每个学期学分最高的课程信息,列出开课学期、课程名和学分。
select Semester,Cname,Credit from Course c1 where not exists (select * from Course C2 where c1.Semester=c2.Semester and c1.Credit<c2.Credit)
7. 查询每门课程考试成绩最高的学生信息,列出课程号、学生姓名和最高成绩,结果按课程号升序排序,不包括没考试的课程。
select sc1.Sno,Sname,Cno,Grade from SC sc1,Student where not exists (select * from SC sc2 where sc1.Cno=sc2.Cno and sc1.Grade<sc2.Grade ) and Grade is not null and Student.Sno=sc1.Sno order by Cno
8. 查询计算机系学生姓名、年龄和年龄情况,其中年龄情况为:如果年龄小于18,则显示“偏小”;如果年龄在18-22,则显示“合适”;如果年龄大于22,则显示“偏大”。
Select Sname,Sage, case
when Sage<18 then '偏小'
when Sage>=18 and Sage<=22 then '适合'
when Sage>22 then '偏大'
end
as 年龄情况 from Student
9. 统计每门课程的选课人数,包括有人选的课程和没有人选的课程,列出课程号,选课人数及选课情况,其中选课情况为:如果此门课程的选课人数超过100人,则显示“人多”;如果此门课程的选课人数在40~100,则显示“一般”;如果此门课程的选课人数在1~40,则显示“人少”;如果此门课程没有人选,则显示“无人选”。
提示:选课情况列中显示的内容
Select Course.Cno,COUNT(Sno) as 选课人数,
case
when COUNT(Sno)>100 then '人多'
when COUNT(Sno)>=40 and COUNT(Sno)<=100 then '一般'
when COUNT(Sno)>=1 and COUNT(Sno)<40 then '人少'
when COUNT(Sno)=0 then '无人选'
end
as 人数情况 from SC right join Course on Course.Cno=SC.Cno group by Course.Cno
10. 查询计算机系选了VB课程的学生姓名、所在系和考试成绩,并将结果保存到新表VB_Grade中。
select Sname,Sdept,Grade into VB_Grade
from Student,SC,Course where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Cname='VB'
11. 统计每个系的女生人数,并将结果保存到新表Girls中。
select Sdept,sex,COUNT(sex) as 人数 into Girls from Student where sex='女' group by Sdept,sex
12. 创建一个新表,表名为test,其结构为(COL1, COL 2, COL 3),其中,
COL1:整型,允许空值。
COL2:普通编码定长字符型,长度为10,不允许空值。
COL3:普通编码定长字符型,长度为10,允许空值。
试写出按行插入如下数据的语句(空白处表示是空值)。
COL1 | COL2 | COL3 |
| B1 |
|
1 | B2 | C2 |
2 | B3 |
|
create table test(
COL1 int,
COL2 char(10) not null,
COL3 char(10) );
insert into test(COL2) values('B1');
insert into test values(1,'B2','C2');
insert into test(COL1,COL2) values(2,'B2')
13.利用第10题建立的VB_Grade表,将信息管理系选了VB课程的学生姓名、所在系和考试成绩插入到VB_Grade表中。
insert into VB_Grade select Sname,Sdept,Grade from Student,SC,Course where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Sdept='信息管理系' and Cname='VB'
select * from VB_Grade
14. 将所有选修C001课程的学生的成绩加10分。
update SC set Grade=Grade+10 where Cno='C001';
15. 将计算机系所有学生的“计算机文化学”的考试成绩加10分。
update SC set Grade=Grade+10 where Sno in(select SC.Sno from Student,SC,Course where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Cname='计算机文化学')
16. 修改“VB”课程的考试成绩,如果是通信工程系的学生,则增加10分;如果是信息管理系的学生则增加5分,其他系的学生不加分。
提示:根据系别判断加分,case when
update SC set Grade=Grade+
case Sdept
when '通信工程系' then 10
when '信息管理系' then 5
else 0
end
from Student,SC,Course
where SC.Sno=Student.Sno and Course.Cno=SC.Cno and Cname='VB'
17. 删除成绩小于50分的学生的选课记录。
delete from SC where Grade<50
18. 删除计算机系VB考试成绩不及格学生的VB选课记录。
delete from SC from Student,SC,Course where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Sdept='计算机系' and Cname='VB ' and Grade<60
19. 删除“VB”考试成绩最低的学生的VB修课记录。
delete from SC from SC,Course where SC.Cno=Course.Cno and Cname='VB' and Grade=(select MIN(Grade) from SC,Course where SC.Cno=Course.Cno and Cname='VB')
20. 删除没人选的课程的基本信息。
delete from Course from Course left join SC on Course.Cno=SC.Cno where SC.Cno is null
select * from Course;
实验四、视图创建与使用
1. 写出创建满足下述要求的视图的SQL语句,并执行所写代码。
(1)包含学生的学号、姓名、所在系、年龄,课程号、课程名、课程学分的视图。
create view v1 as
select Student.Sno,Sname,Sdept,Sage,SC.Cno,Cname,Credit from
Student,SC,Course where Student.Sno=SC.Sno and Course.Cno=SC.Cno
(2)学生的学号、姓名、选修的课程名和考试成绩的视图。
create view v2 as select Student.Sno,Sname,Cname,Grade from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno
(3)统计每个学生的选课门数,要求列出学生学号和选课门数的视图。
create view v3 as select Sno,COUNT(Cno) CourseNum from SC group by Sno
(4)统计每个学生的修课总学分,要求列出学生学号和总学分的视图(说明:考试成绩大于等于60才可获得此门课程的学分)。
create view v4 as select Sno,SUM(Credit) SumCredit from SC,Course where SC.Cno=Course.Cno and Grade>=60 group by Sno
2. 利用第1题建立的视图,完成如下查询。
(1)查询考试成绩大于等于90分的学生的姓名、课程名和成绩。
select Sname,Cname,Grade from v2 where Grade>90
(2)查询选课门数超过3门的学生的学号和选课门数。
select Sno,CourseNum from v3 where CourseNum>3
(3)查询计算机系选课门数超过3门的学生的姓名和选课门数。
select Sname,CourseNum from v3,Student where v3.Sno=Student.Sno and CourseNum>3 and Sdept='计算机系'
(4)查询修课总学分超过10分的学生的学号、姓名、所在系和修课总学分。
select v4.Sno,Sname,Sdept,SumCredit from v4,Student where v4.Sno=Student.Sno and SumCredit>10
(5)查询年龄大于等于20岁的学生中,修课总学分超过10分的学生的姓名、年龄、所在系和修课总学分。
select Sname,Sage,Sdept,SumCredit from v4,Student where v4.Sno=Student.Sno and SumCredit>10 and Sage>=20
3. 使用WITH CHECK OPTION,在第1题建立的视图(1)的基础上,再创建一个“计算机系”同学的学号、姓名、所在系、年龄,课程号、课程名、课程学分的视图。
create view v5 as select * from v1 where Sdept='计算机系' with check option;
- 增加一条记录,
0841101 | 张新 | 计算机系 | 20 | C001 | 高等数学 | 4 |
(2)修改这条记录为
0841101 | 张新 | 物理系 | 20 | C001 | 高等数学 | 4 |
以上两个操作是否能够实现?为什么?可以实现的,写出SQL语句。
不能实现,因为修改会影响多个基表。
4.以下操作能否实现,如果能实现,给出相应的SQL语句,否则,解释不能实现的原因。
(1)对Student表,创建一个只包含男生信息的视图。对此视图执行将“李勇”的年龄更新为22岁。
create view v6 as select * from Student where Sex='男'
update v6 set Sage=22 where Sname='李勇';
(2)在上题创建的视图中。删除“刘晨”同学的记录。
不能删除,因为刘晨同学的记录信息涉及了多张表
(3)第3题建立的“计算机系”同学的视图,对此视图执行将“李勇”的年龄更新为22岁。
update v5 set Sage=22 where Sname='李勇'
(4)第3题建立的“计算机系”同学的视图,对此视图执行删除“刘晨”同学的记录。
不可更新,因为修改会影响多个基表。
实验五、 数据库安全性访问控制
一、实验目的
1. 熟悉自主访问控制机制
2. 掌握在SQL Server中创建新登录名,创建数据库用户和角色的方法。
3. 熟练使用授权和回收语句实现自主访问控制。
二、实验内容和要求
利用前面建立的学生数据库和其中的Student、Course、SC表,并利用SSMS工具完成下列操作。
三、实验步骤
- 用SSMS工具建立SQL Server身份验证模式的登录名:log1、log2和log3。
方法一:图形界面方式。
点击安全性,右键点击登录名选择“新建用户名”
方法二:SQL语句
其他两个用户用SQL语句进行创建
create login log2 with password='123'
create login log3 with password='123'
- 用log1建立一个新的数据库引擎查询,在“可用数据库”下拉列表框中是否能选中学生数据库?为什么?
打不开,因为没有创建数据库用户做映射。
3. 用系统管理员身份建立一个新的数据库引擎查询,将log1、log2和log3映射为学生数据库中的用户,用户名同登录名。
(1)创建用户log1,log2,log3。
方法一:图形界面方式。
点击学生数据库中安全性,点击用户,右键新建用户,如下图所示:
方法二:SQL语句
CREATE USER <用户名> FROM LOGIN <登录名>
create user log2 from login log2
create user log3 from login log3
(2)创建架构log1,log2,log3,架构所有者分别是用户log1,log2,log3
以log1为例,点击学生数据库,安全性,架构,右键新建架构:
(3)修改log1,log2,log3用户的默认架构
右键用户点击属性,修改架构,以log1为例:
- 在log1建立的数据库引擎查询中,现在在“可用数据库”下列列表框中是否能选中学生数据库?为什么?
可以的
5. 在log1建立的数据库引擎查询中,选中学生数据库,执行下述语句,能否成功?为什么?
不可以 还没有给log1用户授权
6. 在系统管理员的数据库引擎查询中,执行合适的授权语句,授予log1具有对Course表的查询权限,授予log2具有对Course表的插入权限。
grant select on Course to log1
grant insert on Course to log2
7. 用log2建立一个新的数据库引擎查询,执行下述语句,能否成功?为什么?
INSERT INTO Course VALUES('C1001','数据库基础',4,5)
能成功,log2对Course表有插入数据权限
再执行下述语句,能否成功?为什么?
SELECT * FROM Course
当然不行,没有查询的权限
8. 在log1建立的数据库引擎查询中,再次执行下述语句:
SELECT* FROM Course
可以的,有查询的权限
这次能否成功?如果执行下述语句:
INSERT INTO Course VALUES('C103','软件工程',4, 5)
能否成功?为什么?
不能成功,没有权限
9. 登陆 log3,建立一个新的数据库引擎查询,执行下述语句,能否成功?为什么?
CREATE TABLE NewTable(
C1 int,
C2 char(4))
不能成功,没有授予log3的建表权限
10. 授予log3在学生数据库中具有创建表的权限。
Grant CREATE TABLE to log3
11. 登陆log3用户,建立一个新的数据库引擎查询中,再次执行第9题的语句,能否成功?为什么?
可以了,因为已经授予它建表权限了
如果执行下述语句:
SELECT * from NewTable
能否成功?为什么?
可以,对自己新建的表有权限
12.新建登陆名log4,映射为学生数据库用户log4,为该用户选定角色为db_Owner,登陆log4,看看是否能够访问数据库,执行以下操作
根据上面的步骤创建登录用户log4和数据库用户log4,还有架构,角色选定
(1)Select * from student
(2)INSERT INTO Course VALUES('C1016','VB基础',4,5)
(3)CREATE TABLE NewTable2(
C1 int,
C2 char(4))
能否进行,为什么?
可以进行,因为db_Owner拥有对所选数据库的所有权限
13.新建角色R1,赋予查询student表、更新Sc表grade列权限,将角R1授予用户log1,log2,接着执行
create role R1
grant select on student to R1 with grant option;
grant update(grade) on SC to R1 with grant option;
exec sp_addrolemember 'R1', 'log1'
exec sp_addrolemember 'R1', 'log2'
- Select * from student
(2)Update sc
Set grade=grade*0.9
验证log1,log2用户的相应权限。
Log1和log2是拥有R1角色的所有权限的
14. 用户log1的权限如果想转授权给log3,应该怎么操作?动手实践验证你的想法。
用户log1授权给log3只能授自己所拥有的权利(可选择允不允许log3继续授权with grant option)
Grant select on student to log3
Grant update on sc to log3