ITPub博客

首页 > 数据库 > MySQL > MySQL回收某一授权

MySQL回收某一授权

原创 MySQL 作者:壹頁書 时间:2015-11-16 17:59:15 0 删除 编辑
创建测试表
create table t1(id int);
create table t2(id int);
create table t3(id int);
create table t4(msg varchar(100));

如果授权的时候图省事儿,使用通配符授权.
grant select,insert,update,delete on mvbox.* to 'xx'@'localhost' identified by 'xx';

如果以后需要回收某一张表权限的时候,就会比较麻烦.
mysql> show grants for xx@'localhost';
+-----------------------------------------------------------------------------------------------------------+
| Grants for xx@localhost                                                                                   |
+-----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'xx'@'localhost' IDENTIFIED BY PASSWORD '*B30134364A2D14319904C2C807363CF2C81ABD5B' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `mvbox`.* TO 'xx'@'localhost'                                     |
+-----------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> revoke insert on mvbox.t1 from xx@'localhost';
ERROR 1147 (42000): There is no such grant defined for user 'xx' on host 'localhost' on table 't1'
mysql>

因为授权是使用的通配符,回收也需要使用通配符.

如果需要回收t1表的insert权限,可以使用如下的触发器.
  1. delimiter //
  2. CREATE TRIGGER tri1 BEFORE INSERT ON t1 FOR EACH ROW
  3. BEGIN
  4.     DECLARE msg varchar(100);
  5.     DECLARE cu varchar(40);
  6.     set cu=(select substring_index((select user()),'@',1)) ;
  7.     IF cu='xx' THEN
  8.             set msg = concat(cu,"You have no right to operate data!please connect DBAs");
  9.             SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
  10.     END IF;
  11. END;
  12. //
  13. delimiter ;
这时,以xx登录,insert t1表则报错如下
mysql> insert into t1 values(10);
ERROR 1644 (HY000): xx You have no right to operate data!please connect DBAs


这里需要注意的是current_user,user函数,在触发器调用的时候,返回的内容是不一样的.
删除原来的触发器,新建一个触发器测试

  1. drop trigger tri1;
  2. delimiter //
  3. CREATE TRIGGER `tri2` BEFORE INSERT ON `t1` FOR EACH ROW
  4. BEGIN
  5.     insert into t4 values(concat(current_user(),',',user(),',',session_user()));
  6. END;
  7. //
  8. delimiter ;
使用xx用户登录,执行如下命令
mysql> insert into t1 values(10);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t4;
+------------------------------------------+
| msg                                      |
+------------------------------------------+
| root@localhost,xx@localhost,xx@localhost |
+------------------------------------------+
1 row in set (0.00 sec)

可以发现在触发器中,current_user()返回的是触发器的定义者.
而user(),session_user()才是连接的用户.

mysql>

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1839760/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339995