日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql characteristic_MySQL存储过程定义中的特性(characteristic)的含义

發布時間:2023/12/2 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql characteristic_MySQL存储过程定义中的特性(characteristic)的含义 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 KKKKKKKK(當然是fuck也行)

CREATE 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;

end

KKKKKKKK(delimiter是fuck的話,這里就是fuck了,結尾的標記而已)

參考:《深入淺出MySQL》

作者:MSSQL123

總結

以上是生活随笔為你收集整理的mysql characteristic_MySQL存储过程定义中的特性(characteristic)的含义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。