MySQL存儲過程定義中的特性(characteristic)的含義

来源:http://www.cnblogs.com/wy123/archive/2017/11/09/7812051.html
-Advertisement-
Play Games

MySQL的存儲過程蠻啰嗦的,與MSSQL或者Oracle的存儲過程相比,如果沒有顯式指定,他會隱含地指定一系列特性(characteristic)的預設值來創建存儲過程 通常在使用圖形界面工具進行存儲過程編寫的時候,圖形界面工具會自動加上這部分內容比,如用HeidiSQL創建存儲過程的時候,會自動 ...


 

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》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 官方文檔參考:SYSDBA is used internally in the Oracle database and has specialized functions. Its behavior is not the same as for generalized users. For exam ...
  • 實驗環境:Oracle Rac 11.2.0.3 首先獲取v$latch的定義:通過PL/SQL或者get ddl等常規途徑只能獲取到v_$latch相關的視圖信息。需要通過特殊方法獲取v$latch的ddl可以通過set autotrace traceonly開啟狀態下執行select * fro ...
  • 準備工作:1 安裝python 3.5,本次使用源碼安裝。2 安裝psutil模塊,使用python3.5自帶的easy_install包直接運行cd /opt/python3/bin./easy_install-3.5 psuitl安裝3 安裝mysql_connector模塊,同樣使用easy_ ...
  • 1, tnsnames.ora on two nodes:RACTEST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = racscan.test.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DED ...
  • [20171110]_allow_read_only_corruption參數.txt--//昨天在修改查詢隱含參數腳本時發現一個參數_allow_read_only_corruption,感覺應該可以在異常關閉的情況下以read only打開.--//自己測試看看.1.環境:SYS@book> @ ...
  • 步驟如下: 檢查預設network的network number,紅色字體1,一會兒添加監聽會用到: 查看srvctl添加監聽的語法: 添加監聽:名稱: LISTENER4 埠號:1524 創建完後會在配置文件endpoints_listener.ora和listener.ora中添加記錄信息: ...
  • 寫了下db2巡檢的一個小腳本,只能做常規檢查,減少日常工作量,腳本內容如下:#!/bash/binecho "物理CPU個數為:"cat /proc/cpuinfo| grep "cpu cores"| uniqecho "邏輯CPU個數為:"cat /proc/cpuinfo| grep "pro ...
  • 看到sort_buffer_size這個參數(connect級別的參數,MySQL5.7,預設值是1048576位元組,也就是1MB)的預設值這麼小,想著是不是可以調大一點,反正記憶體動不動幾十個GB的,也不在乎這個幾MB的。註:筆者嘗試修改這個參數的值,在典型的排序(較大的表,排序欄位無所索引的條件下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...