mysql存儲過程許可權
【存儲過程的許可權】
ALTER ROUTINE 編輯或刪除存儲過程
CREATE ROUTINE 創建存儲過程
EXECUTE運行存儲過程
【存儲過程的創建語法】
delimiter // -- 聲明分隔符(命令結束符)
create
definer = user@hostname | current_user
procere 存儲過程名 (參數)
comment '注釋'
sql security definer | invoker -- sql 的安全設置
begin
存儲過程的body
㈡ mysql 執行存儲過程需要什麼許可權
創建存儲過程的時候可以指定
SQL
SECURITY屬性,設置為
DEFINER
或者INVOKER,用來奉告mysql在執行存儲過程的時候,,是以DEFINER用戶的許可權來執行,還是以調用者的許可權來執行。
默認情況下,使用DEFINER方式,此時調用存儲過程的用戶必須有存儲過程的EXECUTE許可權,並且DEFINER指定的用戶必須是在mysql.user表中存在的用戶。
DEFINER模式下,默認DEFINER=CURRENT_USER,在存儲過程執行時
mysql
會檢查DEFINER定義的用戶'user_name'@'host_name'的許可權;
INVOKER模式下,在存儲過程執行時,會檢查存儲過程調用者的許可權。
㈢ 如何修改mysql 存儲過程許可權
方法如下:
修改mysql 存儲過程的definer
修改mysql.proc表 的definer欄位
update mysql.proc set definer='root@%' where db='servant_591up'; UPDATE `mysql`.`proc` SET `definer`='root00@%' WHERE `db`='test' AND `name`='jjjj' AND `type`='PROCEDURE'; UPDATE `mysql`.`proc` SET `definer`='wtc_678869@%' WHERE `db`='servant_591up' AND `type`='PROCEDURE';
2.修改sql security
ALTER PROCEDURE www SQL SECURITY INVOKER ; ALTER PROCEDURE www SQL SECURITY DEFINER ;
(1)MySQL存儲過程是通過指定SQL SECURITY子句指定執行存儲過程的實際用戶;
(2)如果SQL SECURITY子句指定為DEFINER,存儲過程將使用存儲過程的DEFINER執行存儲過程,驗證調用存儲過程的用戶是否具有存儲過程的execute許可權和DEFINER用戶是否具有存儲過程引用的相關對象的許可權;
(3)如果SQL SECURITY子句指定為INVOKER,那麼MySQL將使用當前調用存儲過程的用戶執行此過程,並驗證用戶是否具有存儲過程的execute許可權和存儲過程引用的相關對象的許可權;
(4)如果不顯示的指定SQL SECURITY子句,MySQL默認將以DEFINER執行存儲過程。
3.執行存儲過程授權
GRANT EXECUTE ON test.* TO 'wtc'@'%'; GRANT CREATE ROUTINE,ALTER ROUTINE, SELECT,CREATE, INSERT, UPDATE, DELETE, EXECUTE ON test.* TO 'wtc'@'%' IDENTIFIED BY '111111'
CREATE ROUTINE : 創建存儲過程的許可權
ALTER ROUTINE : 修改存儲過程的許可權
4.刪除用戶
REVOKE all ON test.* FROM wtc@'%'
DELETE FROM user WHERE User='user_name' and Host='host_name';
FLUSH PRIVILEGES;
好文要頂關注我
㈣ mysql 執行存儲過程需要什麼許可權
創建存儲過程的時候可以指定 SQL SECURITY屬性,設置為 DEFINER 或者INVOKER,用來奉告mysql在執行存儲過程的時候,,是以DEFINER用戶的許可權來執行,還是以調用者的許可權來執行。
默認情況下,使用DEFINER方式,此時調用存儲過程的用戶必須有存儲過程的EXECUTE許可權,並且DEFINER指定的用戶必須是在mysql.user表中存在的用戶。
DEFINER模式下,默認DEFINER=CURRENT_USER,在存儲過程執行時 mysql 會檢查DEFINER定義的用戶'user_name'@'host_name'的許可權;
INVOKER模式下,在存儲過程執行時,會檢查存儲過程調用者的許可權。
㈤ mysql 存儲過程執行太慢怎麼優化
1.當我們請求mysql伺服器的時候,MySQL前端會有一個監聽,請求到了之後,伺服器得到相關的SQL語句,執行之前(虛線部分為執行),還會做許可權的判斷
2.通過許可權之後,SQL就到MySQL內部,他會在查詢緩存中,看該SQL有沒有執行過,如果有查詢過,則把緩存結果返回,說明在MySQL內部,也有一個查詢緩存.但是這個查詢緩存,默認是不開啟的,這個查詢緩存,和我們的Hibernate,Mybatis的查詢緩存是一樣的,因為查詢緩存要求SQL和參數都要一樣,所以這個命中率是非常低的(沒什麼卵用的意思)。
3.如果我們沒有開啟查詢緩存,或者緩存中沒有找到對應的結果,那麼就到了解析器,解析器主要對SQL語法進行解析
4.解析結束後就變成一顆解析樹,這個解析樹其實在Hibernate裡面也是有的,大家回憶一下,在以前做過Hibernate項目的時候,是不是有個一個antlr.jar。這個就是專門做語法解析的工具.因為在Hibernate裡面有HQL,它就是通過這個工具轉換成SQL的,我們編程語言之所以有很多規范、語法,其實就是為了便於這個解析器解析,這個學過編譯原理的應該知道.
5.得到解析樹之後,不能馬上執行,這還需要對這棵樹進行預處理,也就是說,這棵樹,我沒有經過任何優化的樹,預處理器會這這棵樹進行一些預處理,比如常量放在什麼地方,如果有計算的東西,把計算的結果算出來等等...
6.預處理完畢之後,此時得到一棵比較規范的樹,這棵樹就是要拿去馬上做執行的樹,比起之前的那棵樹,這棵得到了一些優化
7.查詢優化器,是MySQL裡面最關鍵的東西,我們寫任何一條SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它會怎麼去執行?它是先執行username = toby還是password = 1?每一條SQL的執行順序查詢優化器就是根據MySQL對數據統計表的一些信息,比如索引,比如表一共有多少數據,MySQL都是有緩存起來的,在真正執行SQL之前,他會根據自己的這些數據,進行一個綜合的判定,判斷這一次在多種執行方式裡面,到底選哪一種執行方式,可能運行的最快.這一步是MySQL性能中,最關鍵的核心點,也是我們的優化原則.我們平時所講的優化SQL,其實說白了,就是想讓查詢優化器,按照我們的想法,幫我們選擇最優的執行方案,因為我們比MySQL更懂我們的數據.MySQL看數據,僅僅只是自己收集到的信息,這些信息可能是不準確的,MySQL根據這些信息選了一個它自認為最優的方案,但是這個方案可能和我們想像的不一樣.
8.這里的查詢執行計劃,也就是MySQL查詢中的執行計劃,比如要先執行username = toby還是password = 1
9.這個執行計劃會傳給查詢執行引擎,執行引擎選擇存儲引擎來執行這一份傳過來的計劃,到磁碟中的文件中去查詢,這個時候重點來了,影響這個查詢性能最根本的原因是什麼?就是硬碟的機械運動,也就是我們平時熟悉的IO,所以一條查詢語句是快還是慢,就是根據這個時間的IO來確定的.那怎麼執行IO又是什麼來確定的?就是傳過來的這一份執行計劃.(優化就是制定一個我們認為最快的執行方案,最節省IO,和執行最快)
10.如果開了查詢緩存,則返回結果給客戶端,並且查詢緩存也放一份。
㈥ mysql 存儲過程 是什麼意思
用select...into語句
下面是mysql 5.0的幫助文檔的:
這個SELECT語法把選定的列直接存儲到變數。因此,只有單一的行可以被取回。
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
注意,用戶變數名在MySQL 5.1中是對大小寫不敏感的。請參閱9.3節,「用戶變數」。
重要: SQL變數名不能和列名一樣。如果SELECT ... INTO這樣的SQL語句包含一個對列的參考,並包含一個與列相同名字的局部變數,MySQL當前把參考解釋為一個變數的名字。例如,在下面的語句中,xname 被解釋為到xname variable 的參考而不是到xname column的:
CREATE PROCEDURE sp1 (x VARCHAR(5))
BEGIN
DECLARE xname VARCHAR(5) DEFAULT 'bob';
DECLARE newname VARCHAR(5);
DECLARE xid INT;
SELECT xname,id INTO newname,xid
FROM table1 WHERE xname = xname;
SELECT newname;
END;
當這個程序被調用的時候,無論table.xname列的值是什麼,變數newname將返回值『bob』。
㈦ 利用mysql的存儲過程比單獨執行mysql的優勢在哪裡好處有什麼
計算機上調用Transaction-SQL 編寫的一段程序原因在於存儲過程具有以下優點
1 存儲過程允許標准組件式編程
存儲過程在被創建以後可以在程序中被多次調用而不必重新編寫該存儲過程的SQL語句而且資料庫專業人員可隨時對存儲過程進行修改但對應用程序源代碼毫無影響因
為應用程序源代碼只包含存儲過程的調用語句從而極大地提高了程序的可移植性
2 存儲過程能夠實現較快的執行速度
如果某一操作包含大量的Transaction-SQL 代碼或分別被多次執行那麼存儲過程要比批處理的執行速度快很多因為存儲過程是預編譯的在首次運行一個存儲過程時查詢優化器對其進行分析優化並給出最終被存在系統表中的執行計劃而批處理的Transaction-SQL 語句在每次運行時都要進行編譯和優化因此速度相對要慢一些
3 存儲過程能夠減少網路流量
對於同一個針對數據資料庫對象的操作如查詢修改如果這一操作所涉及到的Transaction-SQL 語句被組織成一存儲過程那麼當在客戶計算機上調用該存儲過程時網路中傳送的只是該調用語句否則將是多條SQL 語句從而大大增加了網路流量降低網路負載
4 存儲過程可被作為一種安全機制來充分利用
系統管理員通過對執行某一存儲過程的許可權進行限制從而能夠實現對相應的數據訪問許可權的限制避免非授權用戶對數據的訪問保證數據的安全我
㈧ MYSQL如果將修改存儲過程的許可權給別的用戶
最佳答案語法是錯的。
GRANT EXECUTE ON PROCEDURE 存儲過程名稱 to 用戶名稱;
前提是執行這條語句的用戶是有這個存儲過程的許可權的。
㈨ mysql創建的事件怎麼去調用存儲過程
在事件里運行下列調用存儲過程語句就可以了,前提是用戶要有運行該存儲過程的許可權
CALL Procere_Name([parameter[,...]]);
例如:
Call myPro(100,'Johnson');