2010-04-19 75 views
17

我寫的所有的MySQL的程序爲[email protected]創建存儲過程時需要「定義者」嗎?

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`(...) 

麻煩的是,部署到另一臺服務器的時候,我有當前用戶更換root,並與當前的IP,這是惱人的更換localhost

有什麼辦法可以編寫程序,以便有人想要使用我的數據庫和程序,而不必修改每個程序的定義者?

回答

13

在MySQL文檔中所述here

CREATE 
[DEFINER = { user | CURRENT_USER }] 
PROCEDURE sp_name ([proc_parameter[,...]]) 
[characteristic ...] routine_body 

因此,定義者的部分是不是強制性的,只是CREATE PROCEDURE應該工作。

+0

它說:「定義者子句決定在觸發啓動時檢查訪問權限時要使用的安全上下文的更多細節將在本節後面給出。」 因此,當我確定,程序僅用於特權用戶,我可以完全刪除整個定義的東西? – Xorty 2010-04-19 09:18:12

+0

是的,我想。我認爲,當你定義用戶的權限有一個「執行程序」權限,可以授予/拒絕(不知道這個...) – maid450 2010-04-19 10:04:55

+0

好,我會稍後嘗試,如果它的工作迴應。 Thanx – Xorty 2010-04-19 10:13:54

1
CREATE DEFINER=[your_web_user]@% PROCEDURE p_add_user(...) 

檢查它..也許這會幫助你,如果你想在你的過程來定義用戶...

+2

你有可能解釋屬性DEFINER嗎? %意味着 - 它允許任何用戶從任何IP地址? PLS。回覆我。 我使用的是自動創建DEFINER的godaddy共享主機,我們無法將其刪除。它被稱爲DEFINER = [數據庫名稱] @%,但它不允許我從本地Windows應用程序傳遞存儲過程;但我可以溝通,如果我使用正常查詢(如:select * from tablenm ...) 任何人都可以幫助我在這方面 - 請。 – Sensa 2012-04-24 12:35:15

0

您可以通過在過程體中添加以下語句中指定執行權限(後聲明):

SQL SECURITY INVOKER 

實施例:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`() 
SQL SECURITY INVOKER 
(...) 

這樣做,實際調用p將應用特權和DEFINER部分被省略(即使在模式導入期間自動添加)。 完整的參考這裏: https://dev.mysql.com/doc/refman/5.7/en/stored-programs-security.html