尝试使用通配符在多个表上授予用户select特权,如下所示:
GRANT SELECT ON 'DBname'.'foo_%' TO 'username'@'%' IDENTIFIED BY 'password';但是,请继续给出以下错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''DBname'.'foo_%' TO 'username'@'%' IDENTIFIED BY 'password'' at line 1服务器版本:5.7.30-日志MySQL社区服务器
我确信查询的语法是正确的,但出于某种原因,它不会接受它,有什么建议吗?
发布于 2020-10-21 15:38:31
MySQL 5.7 GRANT语法文档提供了一些关于通配符的有趣内容
根据副标题Object Quoting Guidelines,第1款规定:
虽然引用在许多情况下是可选的:帐户、数据库、表、列和例程名称,但GRANT语句中的几个对象都会被引用。例如,如果帐户名称中的user_name或host_name值作为未引用标识符是合法的,则不需要引用它。但是,要指定包含特殊字符(例如-)的user_name字符串或包含特殊字符或通配符(例如%)的host_name字符串(例如,‘test-user’@‘%..com’),必须使用引号。分别引用用户名和主机名。
第3和第4段说
当在授予数据库级别特权的GRANT语句中指定数据库名称时,允许使用_和%通配符(GRANT .在db_name上)。例如,这意味着要使用_字符作为数据库名称的一部分,在GRANT语句中指定它为__,以防止用户访问与通配符模式匹配的其他数据库(例如,GRANT .在
foo\_bar__上。.)。当数据库名称不用于在数据库级别上授予权限时,而是作为将特权授予其他对象(如表或例程)的限定符(例如,授予.在db_name.tbl_name上,通配符被视为普通字符。
那么表特权呢?请注意上面的文档Table Privileges:
表特权适用于给定表中的所有列。若要分配表级特权,请在db_name.tbl_name语法上使用:将mydb.mytbl上的所有权限授予“someuser”@“somehost”;授予SELECT,将mydb.mytbl插入到“someuser”@“somehost”;如果指定tbl_name而不是db_name.tbl_name,则该语句将应用于默认数据库中的tbl_name。如果没有默认数据库,则会发生错误。表级别上允许的priv_type值为ALTER、CREATE、CREATE、DELETE、DROP、GRANT选项、INDEX、INSERT、REFERENCES、SELECT、SHOW、触发器和UPDATE。表级特权适用于基表和视图.它们不适用于使用CREATE临时表创建的表,即使表名匹配。有关临时表特权的信息,请参阅第13.1.18.2节“创建临时表语句”。MySQL将表特权存储在mysql.tables_priv系统表中。
如MySQL 5.7 GRANTS文档所示
在评论中给出的解决方法是我过去在提供SELECT视图时所做的事情。
发布于 2020-10-21 15:13:00
您需要在命令中使用跳过特殊字符\。
GRANT SELECT ON 'DBname'.'foo\_%' TO 'username'@'%' IDENTIFIED BY 'password';https://dba.stackexchange.com/questions/278420
复制相似问题