数据库原理实验三——数据完整性与安全性控制

Posted Alfred young

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库原理实验三——数据完整性与安全性控制相关的知识,希望对你有一定的参考价值。

实验目的

  • 熟练掌握基本表的各种完整性定义的方法。
  • 掌握用户的创建以及使用方法。
  • 掌握SQL语句对数据库和表进行安全控制的方法。

实验内容

  • 利用图形用户界面对Student库中,增加以下的约束和索引,并验证违反相关完整性时的数据库系统的违约处理。
    (1) S表的非空约束:为出生日期添加非空约束。

    (2) S表的主键约束:将学号(sno)设置为主键。

    (3) S表的唯一约束:为姓名(sname)添加唯一约束(唯一键)。

    (4) S表的缺省约束:为性别(sgender)添加默认值,其值为“男”。
  • 利用图形用户界面针对Student库,给SC表添加外键约束,将sno,cno设置为外键,其引用表分别是S表和C表,外键名分别为:sc_fk_sno和sc_fk_cno。尝试不同的违反外键约束的策略并进行验证NO action/ restrict/ cascade/ set null。(10分)
    NO ACTION

    CASCADE

    SET NULL
  • 删除student库中的三张表,用SQL语言重新创建有以下约束的表。(10分)
    • S表:基本约束要求同第1小题。
    • C表:cpno是c表的外键,引用自C表的cno。
    • SC表:外键约束如第2小题,同时要求成绩grade的有效值为[0,100]。另外,SC表增加新列id:将id设为主键,且自增字段,每次插入一条选课记录自动+1。

S表的创建

CREATE TABLE student.s (
SNO VARCHAR(45) NOT NULL,
SNAME VARCHAR(45) NULL,
SGENDER VARCHAR(45) NULL DEFAULT '男',
SBIRTH VARCHAR(45) NOT NULL,
SDEPT VARCHAR(45) NULL,
PRIMARY KEY (`SNO`),
UNIQUE INDEX `SNAME_UNIQUE` (`SNAME` ASC) VISIBLE);

C表的创建

CREATE TABLE student.c (  
CNO VARCHAR(45) NOT NULL,  
CNAME VARCHAR(45) NULL,  
CPNO VARCHAR(45) NULL,  
CREDIT INT NULL,  
PRIMARY KEY (CNO),  
FOREIGN KEY (CPNO) REFERENCES student.c (CNO)  
);  

SC表的创建

CREATE TABLE SC (
  ID INT NOT NULL AUTO_INCREMENT,
  SNO VARCHAR(45) NULL,
  CNO VARCHAR(45) NULL,
  GRADE INT NULL CHECK(GRADE >= 0 AND GRADE <= 100),
  PRIMARY KEY (ID),
  CONSTRAINT sc_fk_cno  FOREIGN KEY (CNO)  REFERENCES c (CNO),  
  CONSTRAINT sc_fk_sno  FOREIGN KEY (SNO)  REFERENCES s (SNO)  
);
  • 用SQL语言针对student库添加或者删除以下的完整性约束。(10分)

(1) 增加sgender的取值约束:S表中的sgender取值只能是“男”或“女”。

	ALTER TABLE S
	ADD CHECK(SGENDER IN ('男','女')
	);

(2) 删除第(1)小题所创建的sgender取值约束。

	ALTER TABLE S
	DROP CONSTRAINT S_CHK_1;

(3) 删除SC表的外键约束。

ALTER TABLE SC
DROP CONSTRAINT sc_fk_cno,
DROP CONSTRAINT sc_fk_sno; 

(4) 学生表S中增加新列tname(表示该学生的导师姓名),且要求导师名必须全部是字母(大写小写均可以)、且长度不能低于8个字符。

ALTER TABLE S
ADD COLUMN TNAME VARCHAR(45) NULL 
CONSTRAINT C CHECK(char_length(TNAME) >= 8 AND TNAME like '^[A-Za-z]+$');
  • 在图形用户界面中创建新用户并针对student数据库进行赋权。(20分)

(1) 创建两个可以登录的本地用户: 王明,李勇。
(2) 完成以下的权限赋予:
① 用户王明对所有表均有select和insert的权力。
② 用户李勇对该数据库select,insert,delete, update和create权限。

进入后选择Add Account创建好本地用户后,进入Schema Privileges选择Add Entry授予权限。

  • 用SQL语句授权和收回权限并对权限加以验证。(40分)

要求:首先创建职工表e和部门表d,表结构如下:
职工表e(职工号,姓名,年龄,职务,工资,部门号)
部门表d(部门号,名称,经理名,地址,电话号)
然后创建每道题中涉及的用户,针对每个小题先完成授权并进行权限验证,然后再收回权限并进行权限验证。
(1) 用户王明对两个表有查询权限。

CREATE USER 'wangming'@'localhost';

GRANT SELECT
ON TABLE e
TO 'wangming'@'localhost';

GRANT SELECT
ON TABLE d
TO 'wangming'@'localhost';

REVOKE SELECT
ON TABLE e
FROM 'wangming'@'localhost';

REVOKE SELECT
ON TABLE d
FROM 'wangming'@'localhost';

(2) 用户李勇对两个表有insert和delete权限。

CREATE USER 'liyong'@'localhost';
GRANT INSERT,DELETE
ON TABLE e
TO 'liyong'@'localhost';

GRANT INSERT,DELETE
ON TABLE d
TO 'liyong'@'localhost';
SHOW GRANTS FOR 'liyong'@'localhost';

REVOKE INSERT,DELETE
ON TABLE e
FROM 'liyong'@'localhost';

REVOKE INSERT,DELETE
ON TABLE d
FROM 'liyong'@'localhost';

(3) 每个职工只对自己的记录有查询权限。

CREATE VIEW view_employee 
AS SELECT * FROM e 
WHERE CONCAT(ENAME,'@localhost') = user();

GRANT SELECT ON view_employee TO 'wangming'@'localhost' , 'liyong'@'localhost' , 'liuxing'@'localhost' , 'zhangxin'@'localhost' , 'zhouping'@'localhost' , 'yanglan'@'localhost';


(4) 用户刘星对职工表有查询权限,对工资字段具有更新权限。

CREATE USER 'liuxing'@'localhost';
GRANT SELECT 
ON TABLE e 
TO 'liuxing'@'localhost';

GRANT UPDATE(salary) 
ON TABLE d 
TO 'liuxing'@'localhost';

REVOKE SELECT 
ON TABLE e 
FROM 'liuxing'@'localhost';

REVOKE UPDATE(salary) 
ON TABLE d 
FROM 'liuxing'@'localhost';

(5) 用户张新具有修改这两个表的结构的权限。

CREATE USER 'zhangxin'@'localhost';
GRANT ALTER   
ON TABLE e   
TO 'zhangxin'@'localhost';  
  
GRANT ALTER  
ON TABLE d  
TO 'zhangxin'@'localhost';  

REVOKE ALTER   
ON TABLE e   
FROM 'zhangxin'@'localhost';  
  
REVOKE ALTER  
ON TABLE d  
FROM 'zhangxin'@'localhost';  

(6) 用户周平具有对两个表的所有权限,并具有给其他用户授权的权限。

CREATE USER 'zhouping'@'localhost';

GRANT ALL  
ON TABLE e   
TO 'zhouping'@'localhost'
WITH GRANT OPTION;
  
GRANT ALL  
ON TABLE d  
TO 'zhouping'@'localhost'
WITH GRANT OPTION;


REVOKE ALL PRIVILEGES
ON TABLE e   
FROM 'zhouping'@'localhost';

REVOKE ALL PRIVILEGES 
ON TABLE d   
FROM 'zhouping'@'localhost';

REVOKE GRANT OPTION
ON TABLE e   
FROM 'zhouping'@'localhost';

REVOKE GRANT OPTION
ON TABLE d   
FROM 'zhouping'@'localhost';

(7) 用户杨兰具有从每个部门职工中查询最高工资,最低工资,平均工资的权限,他不能查看每个人的工资。

CREATE VIEW view_yanglan
AS SELECT max(salary),min(salary),avg(salary) 
FROM e;

CREATE USER 'yanglan'@'localhost';

GRANT SELECT 
ON view_yanglan 
TO 'yanglan'@'localhost';

REVOKE SELECT
ON view_yanglan 
FROM 'yanglan'@'localhost';

以上是关于数据库原理实验三——数据完整性与安全性控制的主要内容,如果未能解决你的问题,请参考以下文章

数据库原理—SQL学习总结

数据库原理实验(openGauss)完整性控制

实验4数据库的安全性完整性

20179223《Linux内核原理与分析》第十一周学习笔记

木马分析(控制分析)实验

数据库原理实验(openGauss) 安全性控制