MySQL 不接受表名級別授予的萬用字元
嘗試
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.7
GRANT
語法文件對萬用字元進行了一些有趣的介紹在小標題
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.7
GRANTS
文件所示
- 萬用字元適用於主機名(粗斜體)
- 萬用字元適用於數據庫名稱(粗斜體)
- 文件沒有為表名指定萬用字元
- 萬用字元被視為所有其他數據庫對象的普通字元
評論中給出的解決方法是我在放棄 SELECT 視圖時經常做的事情。
您需要
\
在命令中使用跳過特殊字元GRANT SELECT ON 'DBname'.'foo\_%' TO 'username'@'%' IDENTIFIED BY 'password';