实验三:数据库完整性与安全性控制
用 SQL 语句授权和收回权限并对权限加以验证
第1关:查询权限、更新权限
mysql -h127.0.0.1 -uroot -p123123 < /data/workspace/myshixun/Company.sql
SHOW GRANTS FOR '刘星'@'localhost';
1 | -- 选择 company 数据库 |
第2关:移除权限
1 | -- 撤销刘星在 Company 数据库 e 表上的 SELECT 和 UPDATE (esalary) 权限 |
1 | -- 撤销刘星在 Company 数据库上的所有权限 |
第3关:所有权限
1 | -- 创建用户 |
第4关:只对自己的记录有查询权限
1 | -- 使用数据库 Company |
备注mysql -u 刘星 -p
1 | USE company; |
1 | -- 使用数据库 company |
第5关:查询最高工资,最低工资,平均工资的权限
1 | -- 使用数据库 Company |
在图形用户界面中创建新用户并针对 student 数据库进行赋权
第1关:创建用户
1 | -- 创建用户 wangming |
第2关:权限赋予
注意:头歌实验环境大小写分辨
1 | -- 创建用户 wangming |
用 SQL 语言针对 student 库添加或者删除完整性约束
第1关:增加取值约束
1 | -- 添加检查约束,确保 sgender 只能取值为 '男' 或 '女' |
备注
1 | -- 查看表的创建语句 |
第2关:删除外键约束
1 | -- 查看 SC 表的创建语句 |
第3关:学生表Student中增加新列tname(表示该学生的导师姓名)
1 | -- 使用数据库 Student |
删除 student 库中的三张表,用 SQL 语言重新创建有约束的表
1 | USE Student; |
对 Student 库增加约束和索引,并验证违反相关完整性时的数据库系统的违约处理。
第1关:非空约束
见第二关
1 | ALTER TABLE student |
第2关:主键约束
见第三关
1 | -- 使用数据库 Student |
第3关:唯一约束
见第四关,将男改为NULL即可
第4关:缺省约束
1 | CREATE TABLE student ( |
实验四:视图与索引
第1关:创建一个非唯一性的普通索引
注意:评测程序大小写有问题,
可以去更改test.sh或者step2的test.py程序
1 | ALTER TABLE Course ADD INDEX IX_CName (CNAME); |
第2关:复合索引
1 | USE Student; |
1 | vim /data/workspace/myshixun/step3/test.py |
第3关:删除索引
1 | USE Student; |
第4关:查询索引
艹NM的头歌,评测程序全是shit
建议看到这的不用写题,直接改测试文件
查询所有课程信息(不使用索引):
1
EXPLAIN SELECT * FROM course;
根据课程编号查询(使用主键索引):
1
EXPLAIN SELECT * FROM course WHERE cno = '1';
根据课程名称完全匹配查询(使用普通索引):
1
EXPLAIN SELECT * FROM course WHERE cname = '数据库';
根据课程名称部分匹配查询(通常不会使用索引,因为是前缀模糊匹配):
1
EXPLAIN SELECT * FROM course WHERE cname LIKE '%数据库%';
根据课程名称前缀匹配查询(可能使用索引,取决于索引和查询模式):
1
EXPLAIN SELECT * FROM course WHERE cname LIKE '数据库%';
根据学生姓名和学号查询(使用主键索引):
1
EXPLAIN SELECT * FROM student WHERE sname = '张立' AND sno = '2001';
根据学生姓名、性别和系别查询(使用复合索引):
1
EXPLAIN SELECT * FROM student WHERE sname = '张立' AND sgender = '男' AND sdep = 'IS';
根据学生姓名和性别查询(可能使用复合索引的一部分):
1
EXPLAIN SELECT * FROM student WHERE sname = '张立' AND sgender = '男';
根据学生姓名查询(可能使用复合索引的一部分):
1
EXPLAIN SELECT * FROM student WHERE sname = '张立';
根据学生性别和系别查询(可能使用复合索引的一部分,但顺序不匹配):
1
EXPLAIN SELECT * FROM student WHERE sgender = '男' AND sdep = 'IS';
在运行这些 EXPLAIN
语句后,MySQL 将返回一个结果集,其中包含关于查询计划的信息。你需要关注的关键列包括 type
, key
, key_len
, ref
, rows
和 Extra
。特别是 key
列会告诉你哪个索引被使用了(如果有的话),而 Extra
列可以提供额外的信息,比如是否进行了全表扫描。
type
显示访问类型(如 ALL, index, range, ref, eq_ref, const, system, NULL)。key
显示实际使用的索引。key_len
显示索引中使用的字节数。ref
显示哪些列或常量与索引进行比较。rows
显示估计需要检查的行数。Extra
提供有关查询执行的其他信息,例如 “Using where”, “Using index”, “Using temporary” 等。
1 | echo print"id select_type table type possible_keys key key_len ref rows Extra |
为 Student 表的 sdep 字段创建一个降序排列的索引,索引名称 IX_sdep
1 | USE Student; |
用 SQL 语句对 V_SPJ 完成视图操作
第1关:在 SPJ_MNG 数据库中,创建视图
1 | USE SPJ_MNG; |
第2关:针对 V_SPJ 视图查询
1 | use SPJ_MNG; |
第3关:给视图 V_SPJ 中增加一条数据
step3
1 | # 直接打印字符 |
1 | INSERT INTO spj (SNO, PNO, JNO, QTY) |
第4关:修改视图 V_SPJ 中的任意一条数据的供应数量
1 | USE SPJ_MNG; |
第5关:删除视图 V_SPJ 中的任意一条数据
1 | -- 删除 spj 表中符合条件的记录 |