首先,在mysql存儲過程出現的同時,用戶權限也增加了5種,其中和存儲過程有關的權限有 三種:
ALTER ROUTINE 編輯或刪除存儲過程
CREATE ROUTINE 建立存儲過程
EXECUTE 運行存儲過程
在使用GRANT創建用戶的時候分配這三種權限。 存儲過程在運行的時候默認是使用建立者的權限運行的。
需要注意的是在一個用戶擁有建立存儲過程的權限時,如果其沒有對於select、update或delete等權限的話,雖然操作數據的存儲過程可以建立,但調用存儲過程的話仍是無法成功的,會返回權限錯誤,就算擁有運行存儲過程的權限也一樣。所以,如果有人給你建立了一個沒有select、update、delete權限只有CREATE ROUTINE權限的用戶,罵他吧,他是故意的。
當然這樣的用戶建立的存儲過程倒並不是完全不能使用,創建存儲過程中有一個特征子句可以讓存儲過程使用運行者的權限,在建立存儲過程后只要加上SQL SECURITY INVOKER特征子句就可以了。如下。 CREATE PROCEDURE p() SQL SECURITY INVOKER 這樣的話就可以分配兩批人,一批給與創建存儲過程的權限,作為開發者,一批給與運行存儲過程和select、update、delete權限,作為測試者。(腦筋秀逗了) 有了這種權限分配,mysql的安全性完全不需要在功能層去保護了,我通過root用戶建立的存儲過程,但是在功能層用一個只擁有運行存儲過程權限的用戶來調用。那么,你就算從功能層上得到數據庫的用戶名和密碼,並且模擬了ip,也不能得到你想要的任何東西。 有了權限,我們可以放心大膽的使用存儲過程,不用擔心安全問題了。