mysql 匿名块_MySQL存储过程定义中的特性(characteristic)的含义
MySQL的存儲過程蠻啰嗦的,與MSSQL或者Oracle的存儲過程相比,如果沒有顯式指定,他會隱含地指定一系列特性(characteristic)的默認(rèn)值來創(chuàng)建存儲過程
通常在使用圖形界面工具進(jìn)行存儲過程編寫的時候,圖形界面工具會自動加上這部分內(nèi)容比,
如用HeidiSQL創(chuàng)建存儲過程的時候,會自動生成這些特性(characteristic)的默認(rèn)值。
但是這些特性究竟是干啥的,有什么影響,一直沒有怎么弄清楚。
LANGUAGE SQL
存儲過程語言,默認(rèn)是sql,說明存儲過程中使用的是sql語言編寫的,暫時只支持sql,后續(xù)可能會支持其他語言
NOT DETERMINISTIC
是否確定性的輸入就是確定性的輸出,默認(rèn)是NOT DETERMINISTIC,只對于同樣的輸入,輸出也是一樣的,當(dāng)前這個值還沒有使用
CONTAINS SQL
提供子程序使用數(shù)據(jù)的內(nèi)在信息,這些特征值目前提供給服務(wù)器,并沒有根據(jù)這些特征值來約束過程實際使用數(shù)據(jù)的情況,說白了就是沒有使用的
包括以下四種選擇
1.CONTAINS SQL表示子程序不包含讀或者寫數(shù)據(jù)的語句
2.NO SQL 表示子程序不包含sql
3.READS SQL DATA 表示子程序包含讀數(shù)據(jù)的語句,但是不包含寫數(shù)據(jù)的語句
4.MODIFIES SQL DATA 表示子程序包含寫數(shù)據(jù)的語句。
SQL SECURITY DEFINER
用來指定存儲過程是使用創(chuàng)建者的許可來執(zhí)行,還是執(zhí)行者的許可來執(zhí)行,默認(rèn)值是DEFINER
DEFINER 創(chuàng)建者的身份來調(diào)用,對于當(dāng)前用戶來說:如果執(zhí)行存儲過程的權(quán)限,且創(chuàng)建者有訪問表的權(quán)限,當(dāng)前用戶可以成功執(zhí)行過程的調(diào)用的
說白了就是當(dāng)前用戶調(diào)用存儲過程,存儲過程執(zhí)行的具體操作是借助定義存儲過程的user的權(quán)限執(zhí)行的。
INVOKER 調(diào)用者的身份來執(zhí)行,對于當(dāng)前用戶來說:如果執(zhí)行存儲過程的權(quán)限,以當(dāng)前身份去訪問表,如果當(dāng)前身份沒有訪問表的權(quán)限,即便是有執(zhí)行過程的權(quán)限,仍然是無法成功執(zhí)行過程的調(diào)用的。
說白了就是當(dāng)前用戶調(diào)用存儲過程,只有當(dāng)前用戶有執(zhí)行存儲過程中涉及的對象的操作的權(quán)限的時候,才能成功執(zhí)行。
COMMENT ''
存儲過程的注釋性信息寫在COMMENT里面,這里只能是單行文本,多行文本會被移除到回車換行等,一個字:扯
為什么說這個扯淡呢?
通常情況下,樓主會注釋一個調(diào)用存儲過程的示例在備注里,以免自己活著別人在調(diào)試的時候,參數(shù)很多的時候,可以很快調(diào)用起來,麻煩寫半天參數(shù)之類的
-- 因此就會存在類似如下的注釋,但是注釋中的語句會被全部保存成一行,格式給抹掉了
/*
set @p_parameter1 = 'abc';
set @p_parameter2 = 200;
call mysql_procedure(@p_parameyter1,@p_parameter2)
*/
以下是一個存儲過程的demo,delimiter 僅僅是讓存儲過程知道,遇到delimiter定義的字符的時候是結(jié)束的標(biāo)記。
話說MySQL不支持匿名塊就算了,定義存儲過程的時候,什么時候結(jié)束他自己都解析不出來?
delimiter KKKKKKKK(當(dāng)然是fuck也行)
CREATE DEFINER=`root`@`%` PROCEDURE `porcedureName`(in p_parameter1 varchar(200),in p_parameter2 int,out p_outparameter int)
-- 存儲過程語言,默認(rèn)是sql,說明存儲過程中使用的是sql語言編寫的,暫時只支持sql,后續(xù)可能會支持其他語言
LANGUAGE SQL
-- 是否確定性的輸入就是確定性的輸出,默認(rèn)是NOT DETERMINISTIC,只對于同樣的輸入,輸出也是一樣的,當(dāng)前這個值還沒有使用
NOT DETERMINISTIC
-- 提供子程序使用數(shù)據(jù)的內(nèi)在信息,這些特征值目前提供給服務(wù)器,并沒有根據(jù)這些特征值來約束過程實際使用數(shù)據(jù)的情況,說白了就是沒有使用的
-- ONTAINS SQL表示子程序不包含讀或者寫數(shù)據(jù)的語句
-- NO SQL 表示子程序不包含sql
-- READS SQL DATA 表示子程序包含讀數(shù)據(jù)的語句,但是不包含寫數(shù)據(jù)的語句
-- MODIFIES SQL DATA 表示子程序包含寫數(shù)據(jù)的語句
CONTAINS SQL
-- 用來指定存儲過程是使用創(chuàng)建者的許可來執(zhí)行,還是執(zhí)行者的許可來執(zhí)行,默認(rèn)值是DEFINER
-- DEFINER 創(chuàng)建者的身份來調(diào)用,如果創(chuàng)建者有權(quán)限訪問存儲過程中的表,調(diào)用者有執(zhí)行過程的權(quán)限,就可以執(zhí)行
-- INVOKER 調(diào)用者的身份來執(zhí)行,取決于調(diào)用是否有執(zhí)行過程+執(zhí)行過程中sql語句對應(yīng)的權(quán)限
SQL SECURITY DEFINER
-- 存儲過程的注釋性信息寫在COMMENT里面,這里只能是單行文本,多行文本會被移除到回車換行等,一個字:扯
-- 為什么說這個扯淡呢?
-- 通常情況下,樓主會注釋一個調(diào)用存儲過程的示例在備注里,以免自己活著別人在調(diào)試的時候,參數(shù)很多的時候,調(diào)用起來,麻煩寫半天參數(shù)之類的
-- 因此就會存在類似如下的注釋,但是注釋中的語句會被全部保存成一行,格式給抹掉了
/*
set @p_parameter1 = 'abc';
set @p_parameter2 = 200;
call mysql_procedure(@p_parameyter1,@p_parameter2)
*/
COMMENT ''
begin
select * from user where id = 100;
end
KKKKKKKK(delimiter是fuck的話,這里就是fuck了,結(jié)尾的標(biāo)記而已)
總結(jié)
以上是生活随笔為你收集整理的mysql 匿名块_MySQL存储过程定义中的特性(characteristic)的含义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arachni web mysql数据库
- 下一篇: mysql innodb flush m