轉載:
最近在做一個項目,由於服務器切換,所以需要將原有服務器的mysql數據表以及存儲過程導入到另一個服務器的mysql數據庫中。導入完成之后以為一切是那么的簡單,卻沒有想到總還是出現了一些莫名其妙的問題。
我在用程序調用存儲過程時,總是提示錯誤:
1 The user specified as a definer ('test'@'%') does not exist 1449
查看了自己mysql的用戶表后,發現確實沒有test這個用戶,但是我程序用的是root登錄的,所以感覺有些莫名其妙。
后來通過查資料發現,是由於自己存儲過程設置的安全性為definer,而當時的那個數據庫存在test這個用戶且用的test用戶創建的存儲過程。
所以解決方法主要有以下兩種:
保持definer安全性
1)在navicat上進行修改
將定義者從test改為在該服務器存在的用戶(一般每個服務器都有root@localhost)
2)通過sql語句修改
1 mysql>update mysql.proc set DEFINER='root@localhost' WHERE NAME='' AND db='mydb';
其中,mysql.proc是固定的,definer即要改為的用戶名,name為存儲過程名,db為數據庫名
將安全性修改為invoker
1)在navicat上進行修改
2)通過sql語句進行修改
1 ALTER PROCEDURE proc_name SQL SECURITY INVOKER 2 ALTER PROCEDURE proc_name SQL SECURITY DEFINE
補充:對於Linux,mysql等工具,操作都需要用戶權限,之所以在大多數操作時,沒有出現問題是因為默認是root用戶,root用戶具有最高權限可以操作。
但當操作某些專有的東西功能時,需要登錄對應的用戶信息才可以操作。