程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 數據庫-觸發器與域中的完整性限制

數據庫-觸發器與域中的完整性限制

編輯:DB2教程

數據庫-觸發器與域中的完整性限制


域中的完整性限制

SQL支持域的概念,並可以用CREATE DOMAIN語句建立一個域以及該域應該滿足的完整性約束條件。
[例14]建立一個性別域,並聲明性別域的取值范圍
           CREATE DOMAIN GenderDomain CHAR(2)
           CHECK (VALUE IN ('男','女') );
          這樣[例10]中對Ssex的說明可以改寫為
          Ssex GenderDomain
[例15]建立一個性別域GenderDomain,並對其中的限制命名
           CREATE DOMAIN GenderDomain CHAR(2)
           CONSTRAINT GD CHECK ( VALUE IN ('男','女') );
[例16]刪除域GenderDomain的限制條件GD。
           ALTER  DOMAIN  GenderDomain  
           DROP CONSTRAINT GD;
[例17]在域GenderDomain上增加限制條件GDD。
          ALTER  DOMAIN  GenderDomain  
         ADD CONSTRAINT GDD CHECK (VALUE IN ( '1','0') ); 
通過[例16]和[例17],就把性別的取值范圍由('男','女')改為 ( '1','0') 

觸發器(Trigger)

觸發器(Trigger)是用戶定義在關系表上的一類由事件驅動的特殊過程
由服務器自動激活
可以進行更為復雜的檢查和操作,具有更精細和更強大的數據控制能力

定義觸發器

CREATE TRIGGER語法格式

      CREATE TRIGGER <觸發器名>  
       {BEFORE | AFTER} <觸發事件> ON <表名>
        FOR EACH  {ROW | STATEMENT}
      [WHEN <觸發條件>]
        <觸發動作體>

定義觸發器的語法說明:
1. 創建者:表的擁有者
2. 觸發器名
3. 表名:觸發器的目標表
4. 觸發事件:INSERT、DELETE、UPDATE
5. 觸發器類型
行級觸發器(FOR EACH ROW)
語句級觸發器(FOR EACH STATEMENT)

例如,假設在[例11]的TEACHER表上創建了一個AFTER UPDATE觸發器。如果表TEACHER有1000行,執行如下語句:
    UPDATE TEACHER SET Deptno=5; 
如果該觸發器為語句級觸發器,那麼執行完該語句後,觸發動作只發生一次
如果是行級觸發器,觸發動作將執行1000次 

觸發條件
觸發條件為真
省略WHEN觸發條件

觸發動作體
觸發動作體可以是一個匿名PL/SQL過程塊
也可以是對已創建存儲過程的調用

[例18]  定義一個BEFORE行級觸發器,為教師表Teacher定義完整性規則“教授的工資不得低於4000元,如果低於4000元,自動改為4000元”。
    CREATE TRIGGER Insert_Or_Update_Sal 
         BEFORE INSERT OR UPDATE ON Teacher  
        /*觸發事件是插入或更新操作*/
         FOR EACH ROW                      /*行級觸發器*/
        AS BEGIN                                  /*定義觸發動作體,是PL/SQL過程塊*/
              IF (new.Job='教授') AND (new.Sal < 4000) THEN   
              new.Sal :=4000;                
              END IF;
        END;                               
[例19]定義AFTER行級觸發器,當教師表Teacher的工資發生變化後就自動在工資變化表Sal_log中增加一條相應記錄
   首先建立工資變化表Sal_log
    CREATE TABLE Sal_log
        (Eno    NUMERIC(4)  references teacher(eno),
          Sal     NUMERIC(7,2),
          Username  char(10),
          Date   TIMESTAMP
         );
[例19](續)
CREATE TRIGGER Insert_Sal                   
    AFTER INSERT ON Teacher         /*觸發事件是INSERT*/
    FOR EACH ROW
    AS BEGIN
        INSERT INTO Sal_log VALUES(
           new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
    END;
[例19](續)
CREATE TRIGGER Update_Sal               
   AFTER UPDATE ON Teacher      /*觸發事件是UPDATE */
   FOR EACH ROW
   AS BEGIN 
     IF (new.Sal <> old.Sal) THEN INSERT INTO Sal_log VALUES(
          new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
     END IF;
  END;

激活觸發器

觸發器的執行,是由觸發事件激活的,並由數據庫服務器自動執行
一個數據表上可能定義了多個觸發器
同一個表上的多個觸發器激活時遵循如下的執行順序:
(1) 執行該表上的BEFORE觸發器;
(2) 激活觸發器的SQL語句;
(3) 執行該表上的AFTER觸發器。

[例20]執行修改某個教師工資的SQL語句,激活上述定義的觸發器。
     UPDATE Teacher SET Sal=800 WHERE Ename='陳平';
    執行順序是:
執行觸發器Insert_Or_Update_Sal
執行SQL語句“UPDATE Teacher SET Sal=800 WHERE Ename='陳平';”
執行觸發器Insert_Sal;
執行觸發器Update_Sal 

刪除觸發器

刪除觸發器的SQL語法:
DROP TRIGGER <觸發器名> ON <表名>;
觸發器必須是一個已經創建的觸發器,並且只能由具有相應權限的用戶刪除。

[例21]  刪除教師表Teacher上的觸發器Insert_Sal
     DROP TRIGGER Insert_Sal ON Teacher;

數據庫的完整性是為了保證數據庫中存儲的數據是正確的

RDBMS完整性實現的機制
完整性約束定義機制
完整性檢查機制
違背完整性約束條件時RDBMS應采取的動作

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved