2011-10-05 100 views
5

使用标准的SQL之后 - 都已经在PosgresQL和Oracle这样反复做 - 我希望授予SELECT来schema1 所有表,除了secret的user1在MySQL中,撤销的权限,赋予普通特权

grant select on schema1.* to user1; 
revoke select on schema1.users from user1; 

收到的错误:

ERROR 1147 (42000): There is no such grant defined for user 'user1' on host '%' on table 'secret' 

我在做什么错?


很明显这是标准的MySQL行为!

更容易理解使用MySQL的应用程序缺乏安全性 - 在MySQL中设置正确的用户安全性非常困难。

+1

您应该为每个表格按表格授予SELECT权限。 – Devart

+0

你确定吗? ANSI标准说明我所做的是正确的。 –

回答

5

没什么。 MySQL不会将schema1.*通配符扩展为单个表,也不会存储“异常”。权限表存储授予的权限。因此,由于您实际上没有在schema1.users上授予任何内容,因此MySQL不会撤销任何操作。它只是涉及到MySQL如何处理权限。

+0

因此,MySQL中的GRANT/REVOKE是不是ANSI标准? –

+1

@ccyoung也许吧。我对标准并不熟悉。我知道MySQL还有其他几个地方存在偏差,所以它不会让我感到惊讶。我建议在MySQL团队中开一个错误(这可能已经存在),但也建议在解决之前不要拖延重要的人生决定。我们谈论的核心MySQL已经存在多年(互联网时代已有数个世纪)。有史以来改变的机会是微不足道的。 – Mac