mysql> create user test1@'%'> Query OK, 0 rows affected (0.00 sec)
凡是使用create user方式创建用户则可以默认触发flush privileges
或使用insert into mysql.user
但是不会主动刷新权限,必须手动执行flush privileges;
使用创建好的用户进入数据库
[root@test2 data]# mysql -utest1 -p123456
mysql> show databases; #show命令不需要单独授权,但是其他数据库都不能看到
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec) 用户授权
mysql> help grant;
Name: 'GRANT'
Description:
Syntax:
GRANT
priv_type [(column_list)] #指明权限类型,比如select insert 等
[, priv_type [(column_list)]] ... #如果有多个权限则使用逗号隔开
ON [object_type] priv_level #权限级别
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] #需求
[WITH with_option ...]
GRANT PROXY ON user_specification
TO user_specification [, user_specification] ...
[WITH GRANT OPTION]
有可能表跟函数重名的,如果重名我们的授权只授权于数据库的表,如果授权的是存储函数,一定加FUNCTION并指定函数名
object_type:
TABLE
| FUNCTION
| PROCEDURE
创建用户并指定函数
grant execute on function db.abc to username@'host';
既有表有bac 也有存储函数名为abc 那么如果想定义函数的话 则需要加function参数:
grant execute on function function db.abc to username@'host';
继续往下看
user_specification:
user
[
IDENTIFIED BY [PASSWORD] 'password' #指定用户密码,如果授权密码时,用户不存在,则自动创建用户
GRANT priv(指定权限),priv2..ON[{TABLE|function|PROCEDURE}] {db.tb| routine} to user@host,可定义多个 with option> 授权test1对test1数据库有创建的权限
mysql> grant create on test1.* to 'test1'@'%';
Query OK, 0 rows affected (0.00 sec)
切换至test1登录数据库
[root@test2 data]# mysql -utest1 -p123456;
mysql> create database test1;
Query OK, 1 row affected (0.01 sec)
测试创建表
mysql>create table testtb (id intunsigned auto_increment not null,name char(20),primary key(id));
Query OK, 0 rows affected (0.06 sec)
创建没问题,接下来测试插入数据
mysql>insert into testtb(name) values('to');
ERROR 1142 (42000): INSERT command denied to user 'test1'@'localhost' for table'testtb'
可显是不行的 因为只给了创建的权限但并没有赋予写入表的权限
于是再次授权于其用户insert权限
mysql>grant insert on test1.* to 'test1'@'%';
Query OK, 0 rows affected (0.00 sec)
#这里直接写insert表示直接插入表即可
但是插入数据缺报错了
mysql>insert into testtb(name) values('to');
ERROR 1142 (42000): INSERT command denied to user 'test1'@'localhost' for table'testtb'
重启会话再次执行
插入成功,说明必要时必须要重新建立会话才可以
[root@test2data]# mysql -utest1 -p123456;
mysql>insert into testtb(name) values('to');
Query OK, 1 row affected (0.01 sec)
查看用户权限表
格式: SHOW GRANTS FORUSER;
mysql> SHOW GRANTS FOR 'test1'@'%' ;
+------------------------------------------------------------------------------------------------------+
| Grants fortest1@% |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%'> | GRANT CREATE ON `wpdb`.* TO'test1'@'%' |
| GRANT CREATE ON `abc`.* TO'test1'@'%' |
| GRANT INSERT, CREATE ON `test1`.* TO'test1'@'%' |
| GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%' |
+------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)
赋予其select权限
mysql>grant select on test1.* to 'test1'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'test1'@'%';
+------------------------------------------------------------------------------------------------------+
| Grants fortest1@% |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%'> | GRANT CREATE ON `wpdb`.* TO'test1'@'%' |
| GRANT CREATE ON `abc`.* TO'test1'@'%' |
| GRANT SELECT, INSERT, CREATE ON `test1`.* TO'test1'@'%' |
| GRANT CREATE ON `mysql`.`wpdb` TO 'test1'@'%' |
+------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)
授权具有执行alter权限
我们要在testtb表中加入一个字段,如下所示
mysql>use test1;
Database changed
mysql> select * from testtb;
+----+------+
|> +----+------+
| 1 | to |
+----+------+
1 row in set (0.00 sec)
授权其alter权限
|> +----+------+------+
| 1 | to | 30 |
+----+------+------+
1 row in set (0.00 sec)
更改name字段出现了错误
mysql>update testtb set name=ot where> ERROR 1143 (42000): UPDATE command denied to user 'test1'@'localhost' forcolumn 'name' in table 'testtb'
再次showgrants for 查看其用户权限
在字段上是单独写的,其他权限全部合并起来了
#只要在表级别存储过程级别或存储函数、库级别 全都合并在了一起
在字段或列级别而都以字段级别和列级别合并在一起
mysql>show grants for test1@'%';
+------------------------------------------------------------------------------------------------------+
| Grants fortest1@% |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%'> | GRANT CREATE ON `wpdb`.* TO'test1'@'%' |
| GRANT CREATE ON `abc`.* TO'test1'@'%' |
| GRANT SELECT, INSERT, CREATE,> | GRANT UPDATE (age) ON `test1`.`testtb` TO'test1'@'%' |
| GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%' |
+------------------------------------------------------------------------------------------------------+
6 rows in set (0.00 sec) 删除用户
格式 :
mysql>drop user@host; 用户重命名
renameuser
mysql>help rename user;
Name: 'RENAME USER'
Description:
Syntax:
RENAME USER old_user TO new_user
[, old_user TO new_user] ...
RENAMEUSER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1'; 取消授权
revokefrom
mysql>help revoke;
Name: 'REVOKE'
Description:
Syntax:
REVOKE
priv_type [(column_list)] #想收回那个权限
[, priv_type [(column_list)]] ... #如果是字段上的权限也可以明确指定并收回
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] ...
REVOKE PROXY ON user
FROM user [, user] ...
取消其用户的select权限
mysql>show grants for test1@'%';
+------------------------------------------------------------------------------------------------------+
| Grants fortest1@% |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%'> | GRANT CREATE ON `wpdb`.* TO'test1'@'%' |
| GRANT CREATE ON `abc`.* TO'test1'@'%' |
| GRANT SELECT, INSERT, CREATE,> | GRANT UPDATE (age) ON `test1`.`testtb` TO 'test1'@'%' |
| GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%' |
+------------------------------------------------------------------------------------------------------+
6 rows in set (0.00 sec)
mysql>revoke select on test1.* from test1@'%';
Query OK, 0 rows affected (0.00 sec)
#select已经没有了
mysql> showgrants for test1@'%';
+------------------------------------------------------------------------------------------------------+
| Grants for test1@% |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%'> | GRANT CREATE ON `wpdb`.* TO'test1'@'%' |
| GRANT CREATE ON `abc`.* TO 'test1'@'%' |
| GRANT INSERT, CREATE,> | GRANT UPDATE (age) ON `test1`.`testtb` TO'test1'@'%' |
| GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%' |
+------------------------------------------------------------------------------------------------------+
6 rows in set (0.00 sec)
一般来讲select都是读权限,一般可以赋予,其他权限则都为写权限需要慎重考虑授权