Mysql
舊使用者已刪除,現在出現 DEFINER 錯誤
舊使用者已從
mysql.user
表中刪除,現在在執行某些視圖時,我收到 user@host 不存在的錯誤。同樣在進行轉儲時,由於使用者不存在而無法轉儲視圖。mysql.user
當我從表中刪除舊使用者時,我一直在研究更新定義器的最佳方法。當然,老使用者在一個視圖中是 DEFINERS,或者 sp。我做的一個快速修復是使用正則表達式轉儲數據庫,從轉儲文件中刪除定義器並恢復數據庫 - 這樣新的定義器將是執行恢復操作的使用者。我還在網上找到了 2 種其他方法(https://www.adminbirds.com/mysql/how-to-change-the-definer-for-views/) - 我需要驗證這種方法。
- 更改視圖中的定義器:
SELECT CONCAT("ALTER DEFINER=
youruser@
hostVIEW ", table_name, " AS ", view_definition, ";") FROM information_schema.views WHERE table_schema='your-database-name';
這將生成用於手動更改表中定義器的 alter 語句information_schema.views
。- 要更改儲存過程中的定義器:
UPDATE
mysql.
procp SET definer = 'user@%' WHERE definer='root@%'
這將手動更改mysql.proc
表中的定義器。雖然我從 MySQL 文件頁面中讀到It is not supported that the server will notice manual manipulation of this table.
所以這是我的問題:如果我執行上述命令,它會影響數據嗎?跑步安全嗎?我知道該
ALTER
語句僅影響結構,但只是想確定一下,因為我也將在 prod 環境中執行它。該UPDATE
語句肯定會更改mysql.proc
表中的數據,我需要確保可以安全地進行。請指教。
正如您從兩個命令的文本中看到的那樣 - 它們不適用於單個表以外的數據,因此從這個角度來看 - 兩者都是安全的。
在最壞的情況下 - 您已經沒有工作視圖並繼續擁有它們:),但這不是預期的結果。
但是,無論如何- 最佳實踐 -在任何類型的類似操作之前進行備份,因此您始終可以回滾。
伺服器文件中的注意事項:
伺服器操作 mysql.proc 表以響應創建、更改或刪除儲存常式的語句。不支持伺服器會注意到對該表的手動操作。
與其他類型的操作更相關,例如 - 使用文本或參數手動編輯 BLOB 對象,但更改定義器 - 它只是更改單個列。
我的快速解決方法是使用舊使用者名創建新使用者。