数据库-视图、安全性

周三的炎热的下午,在图书馆搬运我的实验报告。

文章目录

  • 一、实验目的与要求
  • 二、实验内容
    • 1.为fruitshop数据库的各表构造合适的外键,并设置外键级联删除或更新操作,比如表fruits的s_id字段是外键,取值来源于是suppliers表的s_id字段。(附上源码)
    • 2.创建四类用户,每类客户创建一个用户,统一设置初始密码为’123456’:
    • 3.为以上四类用户设计合适的权限,并定义对应的视图(附上源码,创建用户并授权成功后在交互式运行状态下查看每个用户权限并截图)
    • 4退出已用root账号登陆的MySQL服务器,用这四类用户分别登陆MySQL服务器并测试其功能(在交互式运行状态下测试,先附上测试源码,关键结果截图)。
  • 三、实验小结


一、实验目的与要求

1、掌握参照完整性约束
2、设计用户子模式
3、根据实际需要创建不同的用户授以不同的权限
4、针对不同级别的用户定义不同的视图,以保证系统的安全性。

二、实验内容

1.为fruitshop数据库的各表构造合适的外键,并设置外键级联删除或更新操作,比如表fruits的s_id字段是外键,取值来源于是suppliers表的s_id字段。(附上源码)

外键说明或源码:

  1. 表fruits的s_id字段是外键,取值来源于是suppliers表的s_id字段
ALTER TABLE fruits 
ADD FOREIGN KEY fruits(s_id) REFERENCES suppliers (s_id) ON DELETE CASCADE ON UPDATE CASCADE;

2.表orderitems的f_id字段是外键,取值来源于是fruitss表的f_id字段

ALTER TABLE orderitems ADD FOREIGN KEY orderitems(f_id) REFERENCES fruits (f_id) ON DELETE CASCADE ON UPDATE CASCADE;

3.表orderitems的o_num字段是外键,取值来源于是orders表的o_num字段

ALTER TABLE orderitems 
ADD FOREIGN KEY orderitems(o_num) REFERENCES orders(o_num) 
ON DELETE CASCADE ON UPDATE CASCADE;

4.表orders的c_id字段是外键,取值来源于是customers表的c_id字段

ALTER TABLE orders 
ADD FOREIGN KEY orders(c_id) REFERENCES customers(c_id) 
ON DELETE CASCADE ON UPDATE CASCADE;

2.创建四类用户,每类客户创建一个用户,统一设置初始密码为’123456’:

客户:C10000,对应customs表内的10000客户,任意主机地址
供货商:S100,对应suppliers表内的100供货商,任意主机地址
商家销售工作人员:B001,任意主机地址
管理员:A001,本机
源码:

CREATE USER 'C10000'@'%' IDENTIFIED BY '123456';
CREATE USER 'S100'@'%' IDENTIFIED BY '123456';
CREATE USER 'B001'@'%' IDENTIFIED BY '123456';
CREATE USER 'A001'@'localhost' IDENTIFIED BY '123456';

3.为以上四类用户设计合适的权限,并定义对应的视图(附上源码,创建用户并授权成功后在交互式运行状态下查看每个用户权限并截图)

要求:
客户和供货商只能查看与之相关的信息,如C10000用户只可以查看customs表内关于自己的所有信息,可以修改(update)c_id和C_name以外的关于自己的基本信息,可以查看自己的购买信息(在订单order及详单表orderitems中);
同理设置供货商S100的相关权限;
商家销售工作人员B001可以查看并录入信息,但不能随意修改、删除信息;
管理员拥有所有权限。
源码:
客户:
视图:

CREATE VIEW c10000 AS SELECT* FROM customers WHERE c_id = 10000;
CREATE VIEW o10000 AS SELECT orderitems.*,orders.`o_date` FROM orderitems,orders WHERE orders.`c_id`=10000 AND orderitems.`o_num`=orders.`o_num`;

权限:

GRANT SELECT,UPDATE(c_address,c_city,c_zip,c_contact,c_email),
REFERENCES ON fruitshop.`c10000`TO'C10000'@'%';
GRANT SELECT ON fruitshop.`o10000`TO'C10000'@'%';

供货商:
视图:

CREATE VIEW s100 AS SELECT * FROM suppliers WHERE s_id=100;
CREATE VIEW f100 AS SELECT * FROM fruits WHERE s_id=100;

权限:

GRANT SELECT,UPDATE(s_city,s_zip,s_call),
REFERENCES ON fruitshop.`s100`TO'S100'@'%';
GRANT SELECT ON fruitshop.`f100`TO'S100'@'%';

商家销售工作人员:
视图:

CREATE VIEW ob001 AS SELECT * FROM orders;
CREATE VIEW ob002 AS SELECT * FROM orderitems;

权限:

GRANT SELECT,INSERT ON fruitshop.`ob001`TO'B001'@'%';
GRANT SELECT,INSERT ON fruitshop.`ob002`TO'B001'@'%';

管理员:
权限:

GRANT ALL ON fruitshop.* TO'A001'@'localhost';

4退出已用root账号登陆的MySQL服务器,用这四类用户分别登陆MySQL服务器并测试其功能(在交互式运行状态下测试,先附上测试源码,关键结果截图)。

测试要求:退出root帐号,重新登陆指定帐号,显示当前数据库中所有表,查看某张表内的所有信息,对某张表进行增、删、改操作并查看能否正确执行这些操作,如果执行错误请说明导致此错误的原因。
测试客户:
测试源码:

USE fruitshop;
SHOW TABLES;
SELECT*FROM c10000;
UPDATE c10000 SET c_address="泉州",c_city="泉州",c_zip=362000,
c_contact="xiuxiulin",c_email=NULL
WHERE c_id=10000;
SELECT*FROM c10000;
错误权限测试代码:
UPDATE c10000 SET c_id=20000
WHERE c_id=10000;
UPDATE c10000 SET c_name=20000
WHERE c_id=10000;
SELECT*FROM o10000;

测试截图:
数据库-视图、安全性_第1张图片
数据库-视图、安全性_第2张图片
数据库-视图、安全性_第3张图片
数据库-视图、安全性_第4张图片
没有的权限的截图: 客户没有修改(update)c_id和C_name的基本信息的权限
数据库-视图、安全性_第5张图片
数据库-视图、安全性_第6张图片
测试供货商:
测试源码:

USE fruitshop;
SHOW TABLES;
SELECT*FROM s100;
UPDATE s100 SET s_city="xiamen",s_zip="0362441",s_call="12345"
WHERE s_id=100;
SELECT*FROM s100;
SELECT*FROM f100;
错误权限代码:
UPDATE s100 SET s_id=20000
WHERE s_id=100;
UPDATE s100 SET s_name=20000
WHERE s_id=100;

数据库-视图、安全性_第7张图片
数据库-视图、安全性_第8张图片
数据库-视图、安全性_第9张图片
数据库-视图、安全性_第10张图片
没有的权限截图:供应商没有修改(update)s_id和s_name的基本信息的权限
数据库-视图、安全性_第11张图片
数据库-视图、安全性_第12张图片
测试商家销售工作人员:
测试源码:

USE fruiteshop;
SHOW TABLES;
SELECT*FROM Ob001;
INSERT INTO ob001 VALUES(40000,"2018-09-01 01:00:00",10001);
SELECT*FROM Ob001;
SELECT* FROM ob002;
INSERT INTO ob002 VALUES(40000,1,"a1",10,5.20);
SELECT* FROM ob002;
没有的权限的代码的测试:
SELECT* FROM ob001;
UPDATE ob001 SET c_id=100001 WHERE o_num=30001;
DELETE  FROM ob001 WHERE o_num=30001;
SELECT* FROM ob002;
UPDATE ob002 SET f_id=a2 WHERE o_num=30001;
DELETE  FROM ob002 WHERE o_num=30001;

测试截图:
数据库-视图、安全性_第13张图片
数据库-视图、安全性_第14张图片
数据库-视图、安全性_第15张图片
数据库-视图、安全性_第16张图片
出错的截图: 商家销售工作人员没有修改、删除信息的权限
数据库-视图、安全性_第17张图片
数据库-视图、安全性_第18张图片
数据库-视图、安全性_第19张图片
数据库-视图、安全性_第20张图片
测试管理员:
测试源码:

USE fruitshop;
SHOW TABLES;
UPDATE s100 SET s_zip='362441' WHERE s_id=100;
SELECT* FROM s100;

测试截图:
数据库-视图、安全性_第21张图片
数据库-视图、安全性_第22张图片

三、实验小结

1.实验中遇到的问题及解决过程
这次好多噢,
首先是设置权限这一块当时没想到先设置视图再赋予权限,就纠结了一会,
知道了后又纠结视图怎么设置才好,
都弄好了后,发现自己居然忘了保存,又得重来一遍,
然后就是测试的时候没看到保留测试源码,结果等测试完后,又重新一遍,
真的就越急越乱越急越乱,
好在目前都完成了。
2.实验中产生的错误及原因分析
在测试的时候刚开始用命令行窗口,就一错不能回头,而且很少用命令行了,就很多语句忘了,要么就是少了分号啥的,就后面还是明智换成可视化。
3.实验体会和收获。
觉得自己通过这次实验,了解了建立视图,赋予权限,设置外键的完整性等过程,感觉受过到了蛮多的,遇到问题的过程就是学习的过程中,从错误中学习改进,感觉也更熟练了。

你可能感兴趣的:(数据库,mysql,数据库,java)