推荐文档: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;
-
因为我使用的环境是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后面只有一个:
-
前面一点我讲到我在创建用户时选择的是:
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’;
-
我在创建了用户后,我怎么使用新创建的用户登录?因为navicat一打开之后的界面就是“如果你上次的连接没有删除,那么再打开时还是可以显示,只不过显示的是没有连接,需要通过命令行语句然后再连接”。
新创建的用户登录可以选择新建连接,然后输入新的用户名和用户密码!
(这里需要注意的是连接名和用户名是不一样的,然后一般新建连接,默认的用户名就是root,这个地方我们要手动修改一下,不然很容易出错)
新创建的用户登录也可以通过编辑连接,然后输入新的用户名和用户密码!
(这里需要注意的是编辑连接的话需要先关闭服务器连接,不然操作不成功)
-
因为我们新建了许多连接,但是在实验完后可能需要删除,那么这里我又遇到了一个问题,我当时在删除连接的时候,发现报错“server is in use and cann’t be deleted”,这里是因为我们需要先关闭连接,然后才能删除连接。