mysql授权之应用特殊权限赋予

written by Jane.Hoo
给应用赋权,一般只赋予增(insert)改(update)查(select)权限,而delete、alter、drop、create 等权限都是不会赋给应用用户的。但事实上一些特殊的业务场景确实需要这些权限。下面我们着重讲月切及导数。
场景一:月切
应用需要访问表A的数据,由于表A的数据量非常大,需要每月在程序里面做个切表操作。切表的过程如下:
    create table tmp_A as select * from A where 1=2;
    alter table A rename to bak_A_201511;
    alter table tmp_A rename to A;
以上三步操作涉及到的权限有:create\alter\drop,可能大家有疑问,为什么会出现drop权限需求?
alter table ...rename 相当于删除原来的表,然后再新建一张新表,所以包含create\drop权限。
之前有个误区,以为alter\create\drop 上库级别的权限,而事实上是可以定位到表的。
实验如下:
============================================================================
grant select ,insert,update on db.* to user_a@'127.0.0.1' identified by 'xxxxxxxxx';
grant create,drop on db.A to user_a@'127.0.0.1' ;
============================================================================
--使用user_a登录数据库
Database changed
mysql> create table A(id int);
Query OK, 0 rows affected (0.35 sec)
mysql> drop table  A;
Query OK, 0 rows affected (0.03 sec)

mysql> create table A2(id int);
ERROR 1142 (42000): CREATE command denied to user 'user_a'@'127.0.0.1' for table 'A2'
--失败原因是A2表没有赋权
============================================================================
grant create ,drop,alter on db.A_temp to user_a@'127.0.0.1';
grant create ,drop,alter on db.A to user_a@'127.0.0.1';

mysql> alter table  A rename to A_temp;
Query OK, 0 rows affected (0.04 sec)
mysql> alter table  A_temp rename to  A;
Query OK, 0 rows affected (0.12 sec)
mysql> create table  A_temp as select * from  A;
Query OK, 162874 rows affected (4.57 sec)
Records: 162874  Duplicates: 0  Warnings: 0

mysql> alter table  A_temp rename to  A_temp151110;
ERROR 1142 (42000): CREATE command denied to user 'user_a'@'127.0.0.1' for table 'A_temp151110'
--失败了,因为A_temp151110没有在赋权的库表里面
===========================================================
--加上A1511表的建表权限
grant create on db.A1511 to user_a@'127.0.0.1';
mysql>  alter table  A_temp rename to  A1511;
Query OK, 0 rows affected (0.12 sec)
--赋权成功了
所以有这样的赋权需求的话,如果能够确定所有重命名后的表名,可以做这样的权限限定:
grant select ,insert,update on db.* to user_a@'127.0.0.1'identified by 'xxxxxxxx';
grant create ,drop,alter on db.A_temp to user_a@'127.0.0.1';
grant create ,drop,alter on db.A to user_a@'127.0.0.1';
grant create on db.A1511 to user_a@'127.0.0.1';

场景二:导数
相信大家对 load data infile这个命令应该不陌生,它是用来将文本数据按照一定格式导入数据库。它的grant_level只能是 *.*
但是可以通过对它访问的表做限制,来实现限制load data infile可以操作的表
如下:
GRANT FILE ON *.* TO 'loadfileuser'@'localhost' IDENTIFIED BY PASSWORD '*5A4CAF734551B5347FEC1171CEB89D503693C1B4' ;

GRANT SELECT, INSERT, DELETE ON `db`.`a` TO 'loadfileuser'@'localhost' ;
那么load data infile只能操作db下的a表





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

转载于:http://blog.itpub.net/30109892/viewspace-1827071/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值