Mysql

MySQL 不接受表名級別授予的萬用字元

  • January 14, 2022

嘗試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-log MySQL Community Server (GPL)

我確定查詢的語法是正確的,但由於某種原因它不會接受它,有什麼建議嗎?

MySQL 5.7GRANT語法文件對萬用字元進行了一些有趣的介紹

小標題Object Quoting Guidelines下,第 1 段說:

GRANT 語句中的幾個對象需要引用,儘管在許多情況下引用是可選的:帳戶、數據庫、表、列和常式名稱。例如,如果帳戶名稱中的 user_name 或 host_name 值作為不帶引號的標識符是合法的,則無需引用它。但是,在指定包含特殊字元(例如 -)的 user_name 字元串或包含特殊字元或萬用字元(例如 %)的 host_name 字元串時,引號是必需的(例如,’test-user’@’%.com’)。分別引用使用者名和主機名。

第 3 和第 4 段說

在授予數據庫級別權限的 GRANT 語句中指定數據庫名稱時,允許使用 _ 和 % 萬用字元(GRANT … ON db_name.)。這意味著,例如,要將 _ 字元用作數據庫名稱的一部分,請在 GRANT 語句中將其指定為 _,以防止使用者能夠訪問與萬用字元模式匹配的其他數據庫*(例如,GRANT .. . 開foo\_bar.*到 …)。

當數據庫名稱不用於在數據庫級別授予權限,而是作為向某些其他對象(例如表或常式)授予權限的限定符(例如,GRANT … ON db_name.tbl_name)時,將處理萬用字元作為普通字元

餐桌特權呢?請注意以下文件Table Privileges

表權限適用於給定表中的所有列。要分配表級權限,請使用 ON db_name.tbl_name 語法:

GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';

如果您指定 tbl_name 而不是 db_name.tbl_name,則該語句適用於預設數據庫中的 tbl_name。如果沒有預設數據庫,則會發生錯誤。

表級別允許的 priv_type 值為 ALTER、CREATE VIEW、CREATE、DELETE、DROP、GRANT OPTION、INDEX、INSERT、REFERENCES、SELECT、SHOW VIEW、TRIGGER 和 UPDATE。

表級權限適用於基表和視圖。它們不適用於使用 CREATE TEMPORARY TABLE 創建的表,即使表名匹配。有關 TEMPORARY 表權限的資訊,請參閱第 13.1.18.2 節,“CREATE TEMPORARY TABLE 語句”。

MySQL 將表權限儲存在 mysql.tables_priv 系統表中。

如 MySQL 5.7GRANTS文件所示

  • 萬用字元適用於主機名(粗斜體)
  • 萬用字元適用於數據庫名稱(粗斜體)
  • 文件沒有為表名指定萬用字元
  • 萬用字元被視為所有其他數據庫對象的普通字元

評論中給出的解決方法是我在放棄 SELECT 視圖時經常做的事情。

您需要\在命令中使用跳過特殊字元

GRANT SELECT ON 'DBname'.'foo\_%' TO 'username'@'%' IDENTIFIED BY 'password';

引用自:https://dba.stackexchange.com/questions/278420