SQL 支援 Domain 概念,可用 CREATE DOMAIN 定義資料型別及其約束條件。
CREATE DOMAIN GenderDomain CHAR(2) CHECK (VALUE IN ('男', '女'));
後續欄位定義可簡化為:Ssex GenderDomain。
CREATE DOMAIN GenderDomain CHAR(2) CONSTRAINT GD CHECK (VALUE IN ('男', '女'));
-- 刪除舊約束
ALTER DOMAIN GenderDomain DROP CONSTRAINT GD;
-- 新增新約束(改為 1/0)
ALTER DOMAIN GenderDomain ADD CONSTRAINT GDD CHECK (VALUE IN ('1', '0'));
觸發器是定義在關聯表上、由事件驅動的特殊程序,由伺服器自動激活,可執行比 CHECK 約束更複雜的檢查與操作,提供更精細、強大的資料控制能力。
CREATE TRIGGER <觸發器名> {BEFORE | AFTER} <觸發事件> ON <表名>
FOR EACH {ROW | STATEMENT} [WHEN <觸發條件>] <觸發動作體>
INSERT、DELETE、UPDATEFOR EACH ROW) / 敘述級 (FOR EACH STATEMENT)WHEN 子句,條件為真才執行;省略則無條件觸發表 TEACHER 有 1000 列,執行 UPDATE TEACHER SET Deptno=5;:
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
FOR EACH ROW
AS
BEGIN
IF (new.Job = '教授') AND (new.Sal < 4000) THEN
new.Sal := 4000;
END IF;
END;
-- 建立稽核表
CREATE TABLE Sal_log (
Eno NUMERIC(4) REFERENCES teacher(eno),
Sal NUMERIC(7,2),
Username CHAR(10),
Date TIMESTAMP
);
-- INSERT 觸發器
CREATE TRIGGER Insert_Sal
AFTER INSERT ON Teacher
FOR EACH ROW
AS
BEGIN
INSERT INTO Sal_log VALUES (new.Eno, new.Sal, CURRENT_USER, CURRENT_TIMESTAMP);
END;
-- UPDATE 觸發器
CREATE TRIGGER Update_Sal
AFTER UPDATE ON Teacher
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;
BEFORE 觸發器AFTER 觸發器UPDATE Teacher SET Sal=800 WHERE Ename='陳平';
-- 順序:
-- 1. Insert_Or_Update_Sal (BEFORE)
-- 2. UPDATE 敘述
-- 3. Insert_Sal (AFTER INSERT) -- 不會觸發,因為是 UPDATE
-- 4. Update_Sal (AFTER UPDATE)
DROP TRIGGER Insert_Sal ON Teacher;