為什麼此過程會引發特權錯誤?
我無法在遠端 MySQL 數據庫上執行以下過程 - 給定的錯誤是基於權限的 (#1227)。在本地,該過程執行良好。
問題
- 有人可以幫我理解這段程式碼的哪個特定部分引發了這個錯誤,即需要上述特權嗎?
- 有沒有什麼方法可以在沒有特權呼叫的情況下擁有相應的功能?
您需要檢查連接使用者的權限。下次連接時執行:
SHOW GRANTS FOR CURRENT_USER();
這會告訴你兩件事:
- 您是如何被允許進行身份驗證的
- 您對該使用者有什麼特權
查看儲存過程定義的開頭
CREATE DEFINER = 'root'@'localhost' ...
它所說的事實
DEFINER
(SQL 安全性)意味著您在呼叫儲存過程時假定了“root”@“localhost”的權限。然而,有一個問題:您需要EXECUTE權限。為什麼 ?根據儲存過程的 MySQL 文件:
定義者和呼叫者安全上下文的區別如下:
在定義者安全上下文中執行的儲存程序或視圖以其 DEFINER 屬性命名的帳戶的權限執行。這些權限可能與呼叫使用者的權限完全不同。呼叫者必須有適當的權限來引用對象(例如,EXECUTE 呼叫儲存過程或 SELECT 從視圖中選擇),但是當對象執行時,呼叫者的權限被忽略,只有 DEFINER 帳戶權限很重要。如果此帳戶的權限很少,則對象可以執行的操作也相應受到限制。如果 DEFINER 帳戶具有高權限(例如 root 帳戶),則該對象可以執行強大的操作,無論是誰呼叫它。
在呼叫者安全上下文中執行的儲存常式或視圖只能執行呼叫者有權執行的操作。可以指定 DEFINER 屬性,但對在呼叫者上下文中執行的對像沒有影響。
因此,無論您獲得什麼
CURRENT_USER()
,只需授予EXECUTE
該使用者即可。例如,如果CURRENT_USER()
是'myuser'@'somedb'
,登錄'root'@'localhost'
並執行GRANT EXECUTE ON *.* TO 'myuser'@'somedb';
然後,該使用者可以執行任何儲存過程。如果要將其限制為僅
medilife
數據庫中的儲存過程,請執行以下操作:GRANT EXECUTE ON medilife.* TO 'myuser'@'somedb';
試一試 !!!
INFORMATION_SCHEMA 數據庫是一個“偽數據庫”,包含伺服器生成的視圖,據我所知,它只包含只讀數據。如果您需要更改變數,則需要採用標準方式,請參閱 Per 的答案。來自
http://dev.mysql.com/doc/refman/5.1/en/information-schema.html
INFORMATION_SCHEMA 是資訊數據庫,儲存有關 MySQL 伺服器維護的所有其他數據庫的資訊的地方。在 INFORMATION_SCHEMA 中有幾個只讀表。它們實際上是視圖,而不是基表,因此沒有與它們關聯的文件。
有關 GLOBAL_VARIABLES 的更多詳細資訊http://dev.mysql.com/doc/refman/5.1/en/variables-table.html
希望能幫助到你..