說明:
新項目啟動,通過公司運維同學給的數據庫腳本在Navicat中建項目的數據庫,運行腳本時報錯
Error Code: 1227. Access denied; you need (at least one of) the SUPER privilege(s) for this operation
解決:
發現創建的SQL有指定DEFINER,因為自己運行腳本的時候沒有修改DEFINER所以報錯,把DEFINER修改后即可。
-- ---------------------------- -- Procedure structure for test_find_member_info_proc -- ---------------------------- DROP PROCEDURE IF EXISTS `test_find_member_info_proc`; delimiter ;; CREATE DEFINER=`xxx`@`%` PROCEDURE `test_find_member_info_proc`() begin DECLARE mid bigint; DECLARE tid bigint; DECLARE iid bigint; ............. end ;; delimiter ;
存儲過程中的DEFINER說明:
(1) DEFINER的意思是“定義者”,也就是指明此存儲過程有哪個用戶定義的,它跟存儲過程的使用權限無關;可以說,存儲和過程是沒有使用限制的,任何人都可以使用存儲過程,那么為什么還要加上DEFINER指定存儲過程的定義者呢,因為,存儲過程雖然不限制任何人使用,但是它本身的行為必須受到權限限制,也就是存儲過程本身內部具備哪些對數據庫的訪問權限,而這訪問權限便是DEFINER用戶對數據庫的訪問權限。
(2) DEFINER被定義為一個普通的username@hostname用戶就不必說了,如果定義為root@%,有什么特別的嗎?沒有。只不過數據庫中要存在root@%用戶,否則創建的時候沒事,調用的時候就提示root@% is not registered,也就是用戶不存在。
(3) DEFINER也可以省略掉,這樣存儲過程默認的定義者是root@localhost,而一般數據庫在安裝的時候都會有一個root@localhost用戶,所以,該存儲過程也能正常在不同的機器上被使用