Mysql

GRANT ALL PRIVILEGES ON . (…) WITH GRANT OPTION 感到困惑

  • June 20, 2015

通常我通過 phpMyAdmin 管理我的數據庫上的使用者,但由於我在 SQLyog 或 HeidiSQL 等獨立程序中執行其他所有操作,因此我希望能夠從這些程序遠端管理使用者。

  • 遠端使用者已經擁有SUPER,因為在將視圖從本地數據庫複製到遠端數據庫時需要它。
  • 遠端使用者在mysql和目標數據庫上沒有所需的數據庫級權限,因為SUPER沒有提供。

我試過這個(MySQL 5.6.23 版):

GRANT ALL PRIVILEGES ON *.* TO 'UserName'@'myIP' IDENTIFIED BY 'password'
WITH GRANT OPTION

奇怪的是,*.*似乎沒有工作。例如:

SELECT USER, HOST, db, select_priv, insert_priv, grant_priv FROM mysql.db
WHERE db="somedatabase"

返回一個空集。結果,在那個階段,我的遠端使用者無法向使用者授予權限(錯誤 1442)。

但是,

SHOW GRANTS FOR 'UserName'@'myIP'

確實顯示

. 上的所有權限授予“使用者名”@“myIP”,由密碼“someHash”和授予選項辨識

為了解決它,我必須GRANT ALL 專門mysqlsomedatabase上:

GRANT ALL PRIVILEGES ON mysql.* TO 'UserName'@'myIP' IDENTIFIED BY 'password'
WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON somedatabase.* TO 'UserName'@'myIP' IDENTIFIED BY 'password'
WITH GRANT OPTION;

有人會知道為什麼*.*還不夠嗎?

我真的不得不考慮這個。錯誤 1442 影響 GRANT 命令?

注意MySQL 文件

錯誤:1442 SQLSTATE:HY000 (ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG)

消息:無法更新儲存函式/觸發器中的表“%s”,因為它已被呼叫此儲存函式/觸發器的語句使用。

如果您使用託管主機,則已知有些主機會使用觸發器和儲存過程來故意阻止執行 GRANT 命令。

範例:Amazon RDS 允許執行以下操作:

問:我的數據庫實例的主使用者被授予哪些權限?

對於 MySQL,主使用者的預設權限包括:創建、刪除、引用、事件、更改、刪除、索引、插入、選擇、更新、創建臨時表、鎖定表、觸發器、創建視圖、顯示視圖、更改常式、創建常式、執行、觸發、創建使用者、程序、顯示數據庫、授予選項。

哪些贈款是不允許的?

如果您看到錯誤 1442,則您的託管公司必須使用一些編寫為儲存過程的代理程式碼,或者已針對架構創建觸發器以在匯流排下mysql拋出正常命令。GRANT從商業的角度來看,他們這樣做是對的。

如果 Amazon RDS 允許所有授權,您能想像造成的破壞嗎?

  • 如果你有SHUTDOWN,你可以在沒有亞馬遜 API 的情況下關閉 MySQL RDS 實例
  • 如果您有REPLICATION SLAVEREPLICATION CLIENT,您可以在 Amazon 之外設置從站(定義正確的安全組)。
  • 如果有SUPER,您可以終止連接、軟管二進制日誌、增加連接限制等。
  • 如果您有FILE,您可以SELECT ... INTO OUTFILE直接在 MySQL RDS 實例內部和LOAD DATA ... INFILE從外部源創建文件(同樣,定義正確的安全組)。

因此,您需要閱讀託管公司的文件,了解他們對 MySQL 授權的限制。如果亞馬遜使用 RDS 這樣做,我相信其他公司也會有相同的協議。對於 Amazon RDS 使用者而言,解決此問題的方法是放棄 Amazon RDS 並切換到 Amazon EC2。

請聯繫您的託管公司,看看是否確實如此。

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