1. 程式人生 > >數據庫---數據控制語言(DCL)

數據庫---數據控制語言(DCL)

數據表 多個 函數 修改權限 info 有一種 改密碼 case語句 存儲函數

數據控制,其實就是“分配權限”——就涉及到用戶。
則主要就是2個問題:
  用戶管理:
  權限分配:
    有哪些權限。
mysql中的權限
mysql中,權限是系統內定的一些“名詞”(單詞),大約30個,每個權限表示“可以做什麽工作”。 
則分配權限就是相當於讓某個用戶可以做哪些工作。
主要權限如下:

技術分享圖片

mysql中的用戶:mysql中的用戶信息都存儲在系統數據庫mysql的user表中。
創建用戶
語法形式:
  create user ‘用戶名’@’允許其登錄的地址’ identified by ‘密碼’;
說明:
  1,創建的用戶需同時指定該用戶可以在哪個地址進行登錄
    其中“%”代表“任何地址”。


  2,用戶創建之後,自動在mysql的user表中添加了一條記錄,但該用戶還沒有權限

刪除用戶
  drop user ‘用戶名’@’允許其登錄的地址’;

修改用戶密碼
  修改自己密碼: set password = password(‘新密碼’);
  修改他人密碼(必須有修改權限):
    set password for ‘用戶名’@’允許其登錄的地址’ = password(‘新密碼’);

權限分配
增加權限:
  grant 權限名1,權限名2, .... on 數據庫名.對象名 to ‘用戶名’@’允許其登錄的地址’ identified by ‘密碼’;
說明:
  1權限名就是:’select’, ‘update’, ‘delete’,等等。其中ALL 表示“所有權限”,或all privileges也一樣
  2對象名:就是一個數據庫中“裝”的東西,表是最常見的,也可以是視圖,存儲過程,存儲函數等。
    其中:*.*

表示所有數據中的所有對象
    某數據庫名.*表示該數據庫中的所有對象——這個商業上常用。
  3,identified by ‘密碼’用於給一個用戶在此時修改密碼,不寫也可以,那就不修改密碼
  4,但同時該語句也可以創建用戶(如果不存在),但此時identified by ‘密碼’必須寫。

刪除權限
  revoke 權限名1,權限名2, .... on 數據庫名.對象名 from ‘用戶名’@’允許其登錄的地址’ ;
表示從某個用戶身上“取消”某些權限(也許還保留了其他權限)。

事務控制語言(DTL)
什麽是事務
通常,在此之前,我們說,一條語句使用一個分號(;)來結束,並得到執行。
那麽我們說,這個“一次性執行”的過程,可以稱為“一個事務”。
簡單來說,“一條sql語句,就是一個事務”。
則:
數據庫(自然包括mysql數據庫)中的事務,是指,可以將“多條語句”的執行,當作“一條語句”來看到的一種內部機制。


即:“事務”是一種可以保證“多條語句一次性執行完成”或“一條都不執行”的機制。
  事務可以看作是一個“容器”,將多條語句,放入該容器,最後,只要一個命令行,來決定其中的所有語句是否“執行”


事務的特點
  原子性:一個事務中的所有語句,應該做到:要麽全做,要麽一個都不做;
  一致性:讓數據保持邏輯上的“合理性”,比如:一個商品出庫時,既要讓商品庫中的該商品數量減1,又要讓對應用戶的購物車中的該商品加1;
  隔離性:如果多個事務同時並發執行,但每個事務就像各自獨立執行一樣。
  持久性:一個事務執行成功,則對數據來說應該是一個明確的硬盤數據更改(而不僅僅是內存中的變化)。

事務模式:就是讓每條執行語句是否當作“一個事務”來看到的設定項。

mysql默認安裝好之後,其事務模式是:一條語句當作一個事務。
事務的基本實現流程:
  1,聲明事務開始:start transaction;
  2, 設定多條要執行的具體語句,比如:insert, update, delete, select。。。其實就是執行,只是這些執行的語句,並不“生效”——其只是內存狀態下的執行,而不是物理狀態的執行。

3,判斷是否需要執行該些語句:
    if( 判斷是否有錯誤){
        //執行——才針對執行了物理性改變——即生效。
        commit;
    }
    eslse{
        //回滾——不執行任何語句。
        rollback;
    }            

判斷是否有錯誤通常分這兩種環境:
  1,如果是cmd中,直接觀察是否出錯。
  2,如果是php程序中,那就需要使用 mysql_error()函數來判斷是否有錯。
一個事務有多條語句,如果全部正確,則commit,如果有其中任意一條或一條以上發生錯誤,則rollback;

mysql編程
基本語法形式
語句塊模式:

技術分享圖片

在mysql編程中,begin....end;基本代替了原來編程語句中的{...}語法。
但又有所區別:
    一個bigin...end;塊,可以給定一個“標識符”,並且可以使用leave語句來“退出”該語句塊。
基本流程控制語句:
if語句:

技術分享圖片

case語句:(類似php中的switch)

技術分享圖片

while循環語句:

技術分享圖片

mysql中的變量
變量它有一定的使用場景限制(其實包括前面的流程控制語句也這樣):
在通常的執行各種create,insert,delete,update,select等語句的“環境”中,並不使用常規變量,也不能使用流程控制語句。
其實,這些語句只能在編程環境中用——通常的增刪改查,可以稱為命令環境。
  常規mysql命令環境,可以執行:增刪改查
  編程環境:存儲函數中,存儲過程中,觸發器中。
普通變量的聲明語法:
  declare 變量名 變量類型 [default 初始值]
變量的賦值語法:
  set 變量名 = 變量值
 mysql還有一種變量形式,可以稱為“會話變量”
會話變量的形式為: @變量名;
會話變量無需單獨聲明,而是直接賦值就可以,類似php
會話變量的賦值: set 變量名 = 值;
會話變量可以在普通命令行環境中或編程環境中使用。

綜上所述:  語法1:set 變量名 = 表達式;#此語法中的變量必須先使用declare聲明
      語法2:set @變量名 = 表達式; #此方式可以無需declare語法聲明,而是直接賦值,類似php定義變量並賦值。
      語法3:select @變量名 := 表達式;#此語句會給該變量賦值,同時還會作為一個select語句輸出“結果集”
      語法4:select 表達式 into @變量名;#此語句雖然看起來是select語句,但其實並不輸出“結果集”而只是給變量賦值。

總結---兩種變量:
  普通變量:不帶@符,直接寫名字,必須先聲明,後使用(賦值之類),只能用於編程環境
  會話變量:帶@符,無需聲明,直接使用(先賦值),可以用於2種環境。

存儲函數
調用形式:
  跟系統函數的調用形式一樣,直接使用名字,並帶括號,以及根據需要帶實參。
比如:
  select 3, now(), f1(); //f1為自定義的存儲函數。
  select 3, now(), f2(3, ‘abc’, @v1); //帶3個實參,其中@v1是一個前面賦值了的變量。
刪除:drop function [if exists] 存儲函數名;
存儲過程
  存儲過程就是一個沒有返回值數據值的“函數”。
  雖然存儲過程不返回單個數據值,但可以“返回”結果集——這裏的返回起始就是select語句的正常結果表現。
定義形式:

技術分享圖片

其中,
  in,out,inout用於修飾一個形參的“數據流向”:
  in:只作為外部輸入數據,調用環境傳入存儲過程內部,默認值。
  out:只作為輸出數據,即存儲過程傳出到調用環境。
  inout:具有雙重。
存儲過程調用形式:
  call 存儲過程名(實參1,實參2,.....);

刪除:drop procedure [if exists] 存儲過程名;


觸發器
什麽叫觸發器:
  就是mysql中的一種“一觸即發”的機器(機制)。
其實只是預先定義好的一段代碼。該段代碼無需人工調用,而是會在‘預計’好的某個情形下自動執行。
通常就這幾個情形:
  對某個數據表的增(或刪或改)之前(或之後)。 //每個表可見只有6種情形

觸發器內部也跟存儲過程或存儲函數一樣,屬於“編程環境”。
定義形式:

create trigger 觸發器名字 before(或after) insert(或update或delete) on 表名 for each row 
begin
    要執行的代碼,語句塊,編程環境,但這裏也不能使用select語句。
end

在觸發器內部,其中有兩個關鍵字具有特定含義和數據獲取作用:
  new:代表新插入的一條數據,在insert事件的時候有效。
  old:代表舊的一條數據,在update或delete的時候有效。

刪除觸發器: drop trigger 觸發器名

數據庫---數據控制語言(DCL)