資料庫,資料庫學習

來源:互聯網
上載者:User

資料庫,資料庫學習
域中的完整性限制

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次 
[例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應採取的動作

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.