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)是用戶定義在關系表上的一類由事件驅動的特殊過程
由服務器自動激活
可以進行更為復雜的檢查和操作,具有更精細和更強大的數據控制能力
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應采取的動作