標籤:單行 執行 acl where eterm 很多 char ges comment
MySQL的預存程序蠻囉嗦的,與MSSQL或者Oracle的預存程序相比,如果沒有顯式指定,他會隱含地指定一系列特性(characteristic)的預設值來建立預存程序
通常在使用圖形介面工具進行預存程序編寫的時候,圖形介面工具會自動加上這部分內容比如用HeidiSQL建立預存程序的時候,會自動產生這些特性(characteristic)的預設值。
但是這些特性究竟是幹啥的,有什麼影響,一直沒有怎麼弄清楚。
LANGUAGE SQL
預存程序語言,預設是sql,說明預存程序中使用的是sql語言編寫的,暫時只支援sql,後續可能會支援其他語言
NOT DETERMINISTIC
是否確定性輸入就是確定性輸出,預設是NOT DETERMINISTIC,只對於同樣的輸入,輸出也是一樣的,當前這個值還沒有使用
CONTAINS SQL
提供子程式使用資料的內在資訊,這些特徵值目前提供給伺服器,並沒有根據這些特徵值來約束過程實際使用資料的情況,說白了就是沒有使用的
包括以下四種選擇
1.CONTAINS SQL表示子程式不包含讀或者寫資料的語句
2.NO SQL 表示子程式不包含sql
3.READS SQL DATA 表示子程式包含讀資料的語句,但是不包含寫資料的語句
4.MODIFIES SQL DATA 表示子程式包含寫資料的語句。
SQL SECURITY DEFINER
用來指定預存程序是使用建立者的許可來執行,還是執行者的許可來執行,預設值是DEFINER
DEFINER 建立者的身份來調用,對於目前使用者來說:如果執行預存程序的許可權,且建立者有訪問表的許可權,目前使用者可以成功執行過程的調用的
說白了就是目前使用者調用預存程序,預存程序執行的具體操作是藉助定義預存程序的user的許可權執行的。
INVOKER 調用者的身份來執行,對於目前使用者來說:如果執行預存程序的許可權,以當前身份去訪問表,如果當前身份沒有訪問表的許可權,即便是有執行過程的許可權,仍然是無法成功執行過程的調用的。
說白了就是目前使用者調用預存程序,只有目前使用者有執行預存程序中設計的對象的操作的許可權的時候,才能成功執行。
COMMENT ‘‘
預存程序的注釋性資訊寫在COMMENT裡面,這裡只能是單行文本,多行文本會被移除到斷行符號換行等,一個字:扯
為什麼說這個扯淡呢?
通常情況下,樓主會注釋一個調用預存程序的樣本在備忘裡,以免自己活著別人在調試的時候,參數很多的時候,調用起來,麻煩寫半天參數之類的
-- 因此就會存在類似如下的注釋,但是注釋中的語句會被全部儲存成一行,格式給抹掉了
/*
set @p_parameter1 = ‘abc‘;
set @p_parameter2 = 200;
call mysql_procedure(@p_parameyter1,@p_parameter2)
*/
以下是一個預存程序的demo,delimiter 僅僅是讓預存程序知道,遇到delimiter定義的字元的時候是結束的標記。
話說MySQL不支援匿名塊就算了,定義預存程序的時候,什麼時候結束他自己都解析不出來?
delimiter KKKKKKKKCREATE DEFINER=`root`@`%` PROCEDURE `porcedureName`(in p_parameter1 varchar(200),in p_parameter2 int,out p_outparameter int) -- 預存程序語言,預設是sql,說明預存程序中使用的是sql語言編寫的,暫時只支援sql,後續可能會支援其他語言 LANGUAGE SQL -- 是否確定性輸入就是確定性輸出,預設是NOT DETERMINISTIC,只對於同樣的輸入,輸出也是一樣的,當前這個值還沒有使用 NOT DETERMINISTIC -- 提供子程式使用資料的內在資訊,這些特徵值目前提供給伺服器,並沒有根據這些特徵值來約束過程實際使用資料的情況,說白了就是沒有使用的 -- ONTAINS SQL表示子程式不包含讀或者寫資料的語句 -- NO SQL 表示子程式不包含sql -- READS SQL DATA 表示子程式包含讀資料的語句,但是不包含寫資料的語句 -- MODIFIES SQL DATA 表示子程式包含寫資料的語句 CONTAINS SQL -- 用來指定預存程序是使用建立者的許可來執行,還是執行者的許可來執行,預設值是DEFINER -- DEFINER 建立者的身份來調用,如果建立者有許可權訪問預存程序中的表,調用者有執行過程的許可權,就可以執行 -- INVOKER 調用者的身份來執行,取決於調用是否有執行過程+執行過程中sql語句對應的許可權 SQL SECURITY DEFINER -- 預存程序的注釋性資訊寫在COMMENT裡面,這裡只能是單行文本,多行文本會被移除到斷行符號換行等,一個字:扯 -- 為什麼說這個扯淡呢? -- 通常情況下,樓主會注釋一個調用預存程序的樣本在備忘裡,以免自己活著別人在調試的時候,參數很多的時候,調用起來,麻煩寫半天參數之類的 -- 因此就會存在類似如下的注釋,但是注釋中的語句會被全部儲存成一行,格式給抹掉了 /* set @p_parameter1 = ‘abc‘; set @p_parameter2 = 200; call mysql_procedure(@p_parameyter1,@p_parameter2) */ COMMENT ‘‘begin select * from user where id = 100; endKKKKKKKK
參考:《深入淺出MySQL》
MySQL預存程序定義中的特性(characteristic)的含義