mysql grant 授权不起作用

你好啊 2010-03-15 04:14:33
作如下授权
grant all privileges on erp.* to erp@localhost identified by 'erp' with grant option;


phpwind告之无权限。

作如下检查
1.查看表,无权限。
mysql> select * from user where user='erp' \G;
*************************** 1. row ***************************
Host: localhost
User: erp
Password: *AFB5CB3407B6A9292B134C830CABFC1E66101B5C
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
1 row in set (0.00 sec)


2.查看权限,告之已赋权。
mysql> show grants for erp@localhost;                   
+------------------------------------------------------------------------------------------------------------+
| Grants for erp@localhost |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'erp'@'localhost' IDENTIFIED BY PASSWORD '*AFB5CB3407B6A9292B134C830CABFC1E66101B5C' |
| GRANT ALL PRIVILEGES ON `erp`.* TO 'erp'@'localhost' WITH GRANT OPTION |
+------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)


3.用information_schema查看,告之有权限。
mysql> select * from SCHEMA_PRIVILEGES where grantee="'erp'@'localhost'";
+-------------------+---------------+--------------+-------------------------+--------------+
| GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | PRIVILEGE_TYPE | IS_GRANTABLE |
+-------------------+---------------+--------------+-------------------------+--------------+
| 'erp'@'localhost' | NULL | erp | SELECT | YES |
| 'erp'@'localhost' | NULL | erp | INSERT | YES |
| 'erp'@'localhost' | NULL | erp | UPDATE | YES |
| 'erp'@'localhost' | NULL | erp | DELETE | YES |
| 'erp'@'localhost' | NULL | erp | CREATE | YES |
| 'erp'@'localhost' | NULL | erp | DROP | YES |
| 'erp'@'localhost' | NULL | erp | REFERENCES | YES |
| 'erp'@'localhost' | NULL | erp | INDEX | YES |
| 'erp'@'localhost' | NULL | erp | ALTER | YES |
| 'erp'@'localhost' | NULL | erp | CREATE TEMPORARY TABLES | YES |
| 'erp'@'localhost' | NULL | erp | LOCK TABLES | YES |
| 'erp'@'localhost' | NULL | erp | EXECUTE | YES |
| 'erp'@'localhost' | NULL | erp | CREATE VIEW | YES |
| 'erp'@'localhost' | NULL | erp | SHOW VIEW | YES |
| 'erp'@'localhost' | NULL | erp | CREATE ROUTINE | YES |
| 'erp'@'localhost' | NULL | erp | ALTER ROUTINE | YES |
+-------------------+---------------+--------------+-------------------------+--------------+
16 rows in set (0.00 sec)



mysql> flush privileges;

和重启mysqld,均无效果,授权不起作用

请高手指点
...全文
1520 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
老哥讲数据库 2010-03-15
  • 打赏
  • 举报
回复
补充下,“重启mysqld,均无效果,授权不起作用”。并不是不起作用。而是根据你的赋权语句就应该是这个结果。
select * from user where user='erp'\G
给出的结果是这个用户对系统中所有数据库的权限,而不是当个数据库的权限。这也是为什么user表里没有database这个字段的原因。


老哥讲数据库 2010-03-15
  • 打赏
  • 举报
回复
更改下最后的语句
“假如把你个赋权语句改为
grant all privileges on *.* to erp@localhost identified by 'erp' with grant option;


那么,mysql就会把所有的N赋值为Y了,这样就检验到user级别,直接检验通过,而不会继续向下检验了。这样也是检验粒度最小最省时间的。但也把很多其他数据库的权限赋予了erp@localhost用户了。
ACMAIN_CHM 2010-03-15
  • 打赏
  • 举报
回复
[Quote]和重启mysqld,均无效果,授权不起作用[/Quote]你是如何断定“授权不起作用”的?
老哥讲数据库 2010-03-15
  • 打赏
  • 举报
回复
原因是:select * from user where user='erp' \G;给出的是全局的权限,而不是针对某个DB或者SCHEMA得权限。你赋权语句是grant all privileges on erp.* to erp@localhost identified by 'erp' with grant option;也就是针对erp这个数据库赋权。那么你自然会得出权限都是‘N’了。

那么,这是不是错误的呢?答案当然不是了。
具体的流程是这样的:假如你有一个SQL的query,比如是select * from erp.table1。mysql会首先去user表中对比你(erp@localhost)是否有select 权限?发现是N.然后,它并不会直接拒绝这个query,而是会继续对照Database级别上检验权限,会db.user='erp' and db.db='erp' and db.host='localhsot',如果检验通过,则通过,否则继续向下检验,host.db='erp' and host.host='localhost',若检验通过,则通过,否则继续向下检验table级别,然后是column级别。

这就是mysql的权限检查模块的工作过程。

并不是你出现了错误,而是mysql的内部机制就是这样的。
建议你仔细看下这篇文章http://tech.it168.com/a2010/0114/837/000000837456.shtml。这里面对mysql的权限机制做了详细的讲解。

另外,假如把你个赋权语句改为
grant all privileges on *.* to erp@localhost identified by 'erp' with grant option;


那么,mysql就会把所有的N赋值为Y了,这样就检验到user级别,直接检验通过,而不会继续向下检验了。这样也是检验粒度最小最省时间的。但也把很多其他数据库的权限赋予了erp@localhost用户了。

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧