数据库实验四之数据安全性和完整性

实验四 数据库安全性和完整性

一.实验目的

1.加深对数据库安全性和完整性理解;

2.学会授权与回收;

4.理解并体会数据库实体完整性、参照完整性、用户定义的完整性约束条件的作用。

二. 实验内容

对已建好的各表和用户进行权限的授权和回收操作,进行完操作之后检查授权过的用户是否真正具有授予的数据操作的权力了,进行完权力收回操作之后的用户是否确实丧失了收回的数据操作的权力。

定义各种完整性约束条件,之后输入各种数据以验证约束条件的作用。

  1. 设置用户aSPJ表的查询权限。以a登录,验证a的权限。

实验过程:

(1)先创建a用户,密码为“password”:

CREATE USER 'a' IDENTIFIED WITH mysql_native_password BY'password';

       (2)没授权之前验证a的权限:

                登录:

 

运行查询语句:

SELECT sno

from spj

发现是没有对数据库的访问权限的:

(3)再进行授权:

GRANT SELECT

ON spj

TO a;

       (4)登录验证a的权限:

SELECT sno

from spj

               

实验结果:

创建:

授权:

结果分析:

创建用户时,创建’a’@%,不要创建a@host,否则不能授权。

2.设置用户bS表、P表具有修改的权限,并要求b能够将该权限授予其它用户c。分别以bc登录,验证bc的权限。

实验过程:

(1)创建b用户,密码为“bpassword”:

CREATE USER 'b' IDENTIFIED WITH mysql_native_password BY'bpassword';

(2)创建c用户,密码为“cpassword”:

CREATE USER 'c' IDENTIFIED WITH mysql_native_password BY'cpassword';

       (3)进行授权(授予查询和修改权限,只授予修改权限不可以):

GRANT SELECT

ON s

TO b;

GRANT UPDATE

ON s

TO b

WITH GRANT OPTION;

GRANT SELECT

ON p

TO b;

GRANT UPDATE

ON p

TO b

WITH GRANT OPTION;

       (4)登录b用户,验证权限:

               

(5)登录b将s表s5中SNAME改为“为人民”,城市改为“北京”

UPDATE s

SET SNAME='为人民',CITY='北京'

WHERE sno='S1';

(6)将p表中p1改为螺丝,颜色改为红

UPDATE p
SET PNAME='螺丝',COLOR='红'
WHERE pno='p1';

     

(7)登录b,执行授权权限,授予c对s、p表的查询和修改权限

GRANT SELECT
ON s
TO c;

GRANT UPDATE
ON s
TO c

GRANT SELECT
ON p
TO c;

GRANT UPDATE

ON p

TO c

(8)登录c,将s表s5中SNAME改为“为民”,城市改为“上海”

UPDATE s

SET SNAME='为民',CITY='上海'

WHERE sno='S1';

(9)将p表中p1改为螺母,颜色改为蓝

UPDATE p

SET PNAME='螺母',COLOR='蓝'

WHERE pno='p1';

实验结果:

如上所示。

结果分析:

          授予某用户修改权限的时候记得同时授予查询权限,没有select就不能update

3.收回用户ab的权限,并验证用户c权限的情况。

实验过程:

       (1)收回a对spj表的查询权限:

REVOKE SELECT

on spj

FROM a;

       (2)收回b对s、p表的更改权限:

REVOKE UPDATE

on s

FROM b;

REVOKE UPDATE

on p

FROM b;

(3)验证用户c是否还有对s、p表的更改权限:

登录c:

将s表s5中SNAME改为“为国”,城市改为“广州”

UPDATE s

SET SNAME='为国',CITY='广州'

WHERE sno='S1';

将p表中p1改为螺丝,颜色改为绿

UPDATE p

SET PNAME='螺丝',COLOR='绿'

WHERE pno='p1';

实验结果:

       (1)收回a对spj表的查询权限:

       (2)收回b对s、p表的更改权限:

 

       (3)验证用户c是否还有对s、p表的更改权限:

         

 

结果分析:

        只收回了b的权限,b授予c的权限并没有收回,说明mysql并没有进行级联回收。

4.对实验1中创建的表,用图形用户界面建立外键联系,并验证外键的作用。

实验过程:

  1. 右键----设计表----外键----创建外键

 

(2)验证外键作用:(在spj表中插入一条违背外键约束的数据)

往spj表插入('S8','P1','J9',200):

INSERT INTO spj VALUES('S8','P1','J9',300);

实验结果:

结果分析:

S表最大到S6,p表最大到P6,j表最大到J7,插入的数据是违背外键约束的,所以会报错。

5.对实验1中创建的表,设置零件的颜色必须在红、橙、黄、绿、青、蓝、紫 七种颜色范围内,零件重量不能超过50的约束条件,并给这两种约束条件命名,名字为自己姓名的全拼(xiaoming)

实验过程:

(1)添加约束:

ALTER TABLE p

ADD CONSTRAINT xiaoming CHECK(COLOR in ('红','橙','黄','绿','青','蓝','紫')and WEIGHT<=50);

(2)验证约束有没有用,把p表里P1的“绿“改为“赤”

UPDATE p
SET color='赤'
WHERE pno='P1';

实验结果:

(1)添加约束:

(2)验证约束有没有用,把p表里P1的“绿“改为“赤”

结果分析:

          验证约束有没有用,把p表里P1的“绿“改为“赤”,运行会报错,xiaoming约束已存在。数据自然改不了了。

6.设置SPJ表中供应零件的数量都不能超过1000

实验过程:

       (1)添加约束:

ALTER TABLE spj

add CHECK(QTY<=1000);

        (2)在spj表里将第一条数据的QTY修改为1200

UPDATE spj

SET QTY=1200

WHERE sno='S1' AND pno='P1' AND jno='J4';

实验结果:

(1)添加约束:

(2)在spj表里将第一条数据的QTY修改为1200

结果分析:

由于约束的存在,不能将数据修改为大于1000的数。

7.设置S表中的供应商号以字母‘S’开头

实验过程:

ALTER TABLE s
add CHECK(sno like 's%');

实验结果:

结果分析:

          创建约束,CHECK(sno like 's%')

8.验证各个表的实体完整性。

实验过程:

-- 验证s表的实体完整性
-- (1)往s表插入一条正常的数据
INSERT INTO s VALUES('S7','红旗',10,'济南');
-- (2)往s表插入一条重复的数据
INSERT INTO s VALUES('S7','群众',10,'青岛');
-- (3)往s表插入一条空的数据
INSERT INTO s VALUES('','创新',10,'广州');

-- 验证p表的实体完整性
-- (1)往p表插入一条正常的数据
INSERT INTO p VALUES('P7','轮胎',null,20);
-- (2)往p表插入一条重复的数据
INSERT INTO p VALUES('P7','轮胎',null,20);
-- (3)往p表插入一条空的数据
INSERT INTO p VALUES(NULL,'钉子',null,5);

-- 验证j表的实体完整性
-- (1)往j表插入一条正常的数据
INSERT INTO j VALUES('J8','造车厂','上海');
-- (2)往j表插入一条重复的数据
INSERT INTO j VALUES('J8','造车厂','上海');
-- (3)往j表插入一条空的数据
INSERT INTO j VALUES(NULL,'轮胎厂','南京');

-- 验证spj表的实体完整性
-- (1)往spj表插入一条正常的数据
INSERT INTO spj VALUES('S7','P6','J7',300);
-- (2)往spj表插入一条重复的数据
INSERT INTO spj VALUES('S7','P6','J7',300);
-- (3)往spj表插入一条空的数据
INSERT INTO spj VALUES('S7',NULL,'J7',300);

实验结果:

-- 验证s表的实体完整性

-- (1)往s表插入一条正常的数据('S7','红旗',10,'济南')

-- (2)往s表插入一条重复的数据('S7','群众',10,'青岛')

-- (3)往s表插入一条空的数据('','创新',10,'广州')

-- 验证p表的实体完整性

-- (1)往p表插入一条正常的数据('P7','轮胎',null,20)

-- (2)往p表插入一条重复的数据('P7','轮胎',null,20)

-- (3)往p表插入一条空的数据(NULL,'钉子',null,5)

-- 验证j表的实体完整性

-- (1)往j表插入一条正常的数据('J8','造车厂','上海')

-- (2)往j表插入一条重复的数据('J8','造车厂','上海')

-- (3)往j表插入一条空的数据(NULL,'轮胎厂','南京')

-- 验证spj表的实体完整性

-- (1)往spj表插入一条正常的数据('S7','P6','J7',300)

-- (2)往spj表插入一条重复的数据('S7','P6','J7',300)

-- (3)往spj表插入一条空的数据('S7',NULL,'J7',300)

结果分析:

          由于s、p、j表创建表时定义的完整性约束,所以不可以插入重复数据,不可以插入主码为null的数据,上述语句即验证了完整性约束。

 

三.实验总结

   问题一:在创建用户的时候,不要创建[用户名]@host,这样执行授权语句的时候会报错,

创建[用户名]@%,就可以执行授权。%代表任何客户机都可以连接 localhost代表只可以本机连接。

问题二:给用户b授予了对s、p表的修改权限之后,登陆上执行更新语句,会报错:

原因是没有把select权限授予b,导致不能update

问题三:查看某用户权限时,可以运行一下MySQL语句(以查询用户a为例):

(1)

show grants for a;

(2)

SELECT * FROM mysql.tables_priv WHERE User='a';

总结:该实验中涉及到的MySQL语法:

--创建用户u1,密码为password:
CREATE USER 'u1' IDENTIFIED WITH mysql_native_password BY'password';

--删除用户u1:
drop user 'u1';

--授予用户u1权限:
GRANT [权限] ON [表名] TO u1;

--查看u1的权限:
show grants for u1; SELECT * FROM mysql.tables_priv WHERE User='u1';

--收回u1的权限:
REVOKE [权限] on [表名] FROM u1;

--添加约束:
ALTER TABLE [表名] ADD CONSTRAINT [约束名] CHECK [约束条件];

--删除约束:
ALTER TABLE [表名] DROP CONSTRAINT [约束名];

猜你喜欢

转载自blog.csdn.net/pzcxl/article/details/130312726