SQL语言—数据安全控制操作(mysql8.0.19、navicat15.0.11) — 怎么建立用户以及怎么使用新用户登录

推荐文档:MySQL官方帮助文档

一、建立用户

用户是定义在数据库中的一个名称,它是数据库的基本访问机制。当与数据库连接时必须提供有效的用户名及口令。

建立用户是使用命令CREATE USER完成的,该命令一般由DBA用户来执行;如果要以其它用户身份建立用户,则要求用户必须具有CREATE USER系统权限。

CREATE USER user-name [ IDENTIFIED BY password ]
[ LOGIN POLICY policy-name ]
[ FORCE PASSWORD CHANGE { ON | OFF } ]

user-name:所创建的用户的名称。

IDENTIFIED BY子句:用户的口令。没有口令的用户不能连接到数据库。

policy-name:指派给用户的登录策略的名称。未指定登录策略时,则应用DEFAULT 登录策略。

FORCE PASSWORD CHANGE子句:控制用户登录时是否必须指定新口令。

该SQL语句仅对具有 MANAGE ANY USER 系统特权的用户有效。

二、更改用户

可对已经存在的数据库用户进行更改。

ALTER USER user-name
[ IDENTIFIED BY password ]
[ LOGIN POLICY policy-name ]
[ FORCE PASSWORD CHANGE { ON | OFF } ]

有关子句的含义同前。

三、删除用户

DROP USER user-name

四、授权

数据库系统使用GRANT 语句将角色和特权授予用户和角色。

具体内容可参见有关文档。这里重点介绍授予对象级特权。

GRANT object-level-privilege, …
ON [ owner.]object-name
TO to-userid, …
[ WITH GRANT OPTION ]
[ FROM from-userid ]

其中的owner为对象属主名(如创建对象的用户名),object-name为对象名(如表名)。

其中的object-level-privilege (对象级特权)既有:

ALL 特权 此特权可授予对表的ALTER、DELETE、INSERT、REFERENCES、SELECT和UPDATE特权。此特权可授予对视图的DELETE、INSERT和UPDATE特权。

ALTER 特权 此特权允许用户使用ALTER TABLE语句更改指定的表。不允许对视图使用此特权。

DELETE 特权 此特权允许用户从指定的表或视图中删除行。

INSERT 特权 此特权允许用户向指定的表或视图插入行。

REFERENCES 特权 此特权允许用户为指定的表以及引用该表的外键创建索引。若指定了列名,则用户只能引用指定列。列的REFERENCES特权不能授予视图,只能授予表。

SELECT 特权 此特权允许用户查看视图或表中的信息。若指定了列名,则用户只能查看指定列(例:GRANT SELECT(BusinessEntityID,LoginID) ON HR.Employee TO UserA)。列的SELECT特权不能授予视图,只能授予表。

UPDATE 特权 此特权允许用户更新视图或表中的行。若指定了列名,则用户只能更新那些列。

WITH GRANT OPTION 若指定WITH GRANT OPTION,则指定的用户ID也会被授予向其它用户ID GRANT(授予)同样的特权。若将WITH GRANT OPTION授予组,则组的成员不会继承WITH GRANT OPTION。

五、撤销授权

数据库系统使用REVOKE 语句撤消用户和角色的角色和特权。

撤消对象级特权

REVOKE object-level-privilege[,…]
ON [ owner.]table-or-view
FROM userid[,…]

其中的有关内容同前。

例题:

设计两个关系模式:
职工(职工号,姓名,年龄,职务,工资,部门号);
部门(部门号,名称,经理名,地址,电话号);
请用SQL的GRANT和REVOKE语句(加上视图机制)完成以下授权定义或存取控制功能:
(a)用户王明对两个表有SELECT权限;
(b)用户李勇对两个表有INSERT和DELETE权限;
(c)用户刘星对职工表有SELECT权限,对工资字段具有更新权力;
(d)用户张新具有修改这两个表的表结构的权力;
(e)用户周平具有对两个表的所有权限(读、插、改、删数据),并有向其他用户授权的权限;

我建立的关系模式如下:
在这里插入图片描述
在这里插入图片描述

(a)用户王明对两个表有SELECT权限;

GRANT SELECT
ON TABLE staff
TO '王明'@'localhost';

GRANT SELECT
ON TABLE department
TO '王明'@'localhost';
(b)用户李勇对两个表有INSERT和DELETE权限;

GRANT INSERT,DELETE
ON TABLE staff 
TO '李勇'@'localhost';

GRANT INSERT,DELETE
ON TABLE department 
TO '李勇'@'localhost';
(c)用户刘星对职工表有SELECT权限,对工资字段具有更新权力;

GRANT SELECT,UPDATE(Swage)
ON TABLE staff
TO '刘星'@'localhost';
(d)用户张新具有修改这两个表的表结构的权力;

GRANT ALTER
ON TABLE staff
TO '张新'@'localhost';

GRANT ALTER
ON TABLE department
TO '张新'@'localhost';
(e)用户周平具有对两个表的所有权限(读、插、改、删数据),并有向其他用户授权的权限;
 
GRANT ALL
ON TABLE staff
TO '周平'@'localhost'
WITH GRANT OPTION;

GRANT ALL
ON TABLE department
TO '周平'@'localhost'
WITH GRANT OPTION;
  1. 因为我使用的环境是mysql-8.0.19,选择的可视化工具是navicat-15.0.11,在刚开始创建用户时,在“王明”和“wangming”中间徘徊,因为我觉得一般使用都是选择英文,中文容易出错,最后我选择的语句还是选择了:

    CREATE USER ‘王明’@‘localhost’ IDENTIFIED BY ‘wangming’ ;

    其实’王明’@'localhost’表示用户名还是王明,只不过是在本机登录,但是我在授权语句中使用的是:

    GRANT SELECT ON TABLE staff,department TO ‘王明’@‘localhost’;

    最后结果报了错误:

    1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘,department
    TO ‘王明’@‘localhost’’ at line 2

    当时我处于的是一种比较困惑的状态,因为我sql语句中使用的标点符号都是英文的,我就不知道自己哪里做错了,后来在同学的帮助下,我就尝试着把ON后面的两个表先删一个,只测试一个表:

    GRANT SELECT ON TABLE staff TO ‘王明’@‘localhost’;

    这样就没有问题了,后来我想着是逗号的原因,就把逗号换成了空格(虽然我想着这样也不太对,但还是试了一下):

    GRANT SELECT ON TABLE staff department TO ‘王明’@‘localhost’;

    事实证明这样的结果也是不对的。

    后来我是在mysql官网上查看的文档,才发现了原因:

    https://dev.mysql.com/doc/refman/8.0/en/grant.html

    还学到了新的知识:

    使用ON,该语句授予特权。
    不使用ON,该语句将授予角色。
    可以为帐户分配特权和角色,但是您必须使用单独的 GRANT语句,每个语句的语法都适合于要授予的语句。

    总结起来就是:在GRANT语句中的ON后面只能跟着一个表或者视图等;

    大家可以看到下面图中圈起来的部分on后面只有一个:
    在这里插入图片描述

  2. 前面一点我讲到我在创建用户时选择的是:

    CREATE USER ‘王明’@‘localhost’ IDENTIFIED BY ‘wangming’ ;

    其实’王明’@'localhost’表示用户名还是王明,只不过是在本机登录,但是我在授权语句中使用以下三种中的任意一种都是错误的:

    GRANT SELECT ON TABLE staff TO ‘王明’;
    GRANT SELECT ON TABLE staff TO “王明”;
    GRANT SELECT ON TABLE staff TO 王明;

    以上三种在我的实验环境中都是错误的。

    我就试着使用非sql语句的方式创建用户,然后看sql预览,然后按照sql语句预览形式,再使用sql语句创建用户,从而看一下navicat的默认创建用户格式是什么,最后发现我输入的sql语句是:

    CREATE USER wangming IDENTIFIED BY ‘wangming’;

    但是查看navicat中的DDL预览是:

    CREATE USER wangming@% IDENTIFIED WITH mysql_native_password;

    这也就表明创建用户默认的是‘用户名’@ ‘%’,这表示本机登录或者远程访问都可以,这样的话GRANT语句后面TO用户名就可以是 “wangming”了

    总结起来就是:如果在创建用户的时候使用了‘用户名’@ ‘%’默认方式,那么在GRANT语句中的用户名直接使用‘用户名’就可以了;但是如果在创建用户的时候使用了‘用户名’@ ‘localhost’这种方式,那么在GRANT语句中的用户名就需要使用‘用户名’@ ‘localhost’;

  3. 我在创建了用户后,我怎么使用新创建的用户登录?因为navicat一打开之后的界面就是“如果你上次的连接没有删除,那么再打开时还是可以显示,只不过显示的是没有连接,需要通过命令行语句然后再连接”。

    新创建的用户登录可以选择新建连接,然后输入新的用户名和用户密码!

    (这里需要注意的是连接名和用户名是不一样的,然后一般新建连接,默认的用户名就是root,这个地方我们要手动修改一下,不然很容易出错)

    新创建的用户登录也可以通过编辑连接,然后输入新的用户名和用户密码!

    (这里需要注意的是编辑连接的话需要先关闭服务器连接,不然操作不成功)

  4. 因为我们新建了许多连接,但是在实验完后可能需要删除,那么这里我又遇到了一个问题,我当时在删除连接的时候,发现报错“server is in use and cann’t be deleted”,这里是因为我们需要先关闭连接,然后才能删除连接。

原创文章 54 获赞 73 访问量 9534

猜你喜欢

转载自blog.csdn.net/qq_43779149/article/details/105982966