数据库系统概论-005: 数据库完整性(正确性和相容性)

来源:互联网 发布:win764精简游戏优化版 编辑:程序博客网 时间:2024/04/30 10:56

一:数据完整性和数据安全性
    1: 数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。
        完整性检查和控制的防范对象时不合语义的,不正确的数据,防止它们进入数据库。
    2: 数据的安全性是保护数据库防止恶意的破坏和非法的存取。
        安全性控制防范的对象时非法用户和非法操作,防止它们对数据库数据库的非法存取。
    3: 为维护数据库的完整性,DBMS能够
        A: 提供定义完整性约束条件的机制
        B: 提供完整性检查的方法
        C: 违约处理

二:实体完整新
    1: 实体完整性定义,即PRIMARY KEY
        CREATE TABLE S(SNO VARCHAR(10) PRIMARY KEY,
          SNAME VARCHAR(20) NOT NULL,
          STATUS VARCHAR(20),
          CITY VARCHAR(20) NOT NULL);
    2: 实体完整性检查和违约处理
        用PRIMARY KEY定义了关系的主码后,每当用户对基本表插入一条记录或者对主码进行列更新操作时。会自动进行检查:
        A: 检查主码值是否唯一,如果不唯一则拒绝插入或修改。
        B: 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。

三:参照完整性
    1: 参照完整性定义:FOREIGN KEY + REFERENCES
        CREATE TABLE SPJ(SNO VARCHAR(10) FOREIGN KEY REFERENCES S(SNO),
          PNO VARCHAR(10) FOREIGN KEY REFERENCES P(PNO),
          JNO VARCHAR(10) FOREIGN KEY REFERENCES J(JNO),
          QTY INT,
                PRIMARY KEY(SNO, PNO, JNO));
    2: 参照完整性的检查和违约处理:
        一个参照完整性将两个表中的相应元组联系起来了,因此,对被参照表和参照表进行增删改操作时有可能破坏参照完整性。
        A: 在SPJ表中增加一个元组,该元组的SNO属性的值在表S中找不到一个元组,其SNO属性值与之相等。
        B: 修改SPJ表中的一个元组,修改后的元组属性SNO值在S中找不到一个元组,其SNO属性值与之相等。
        C: 从S中删除一个元组,照成SPJ表中表中某些元组的SNO属性值在表S中找不到一个元组,其SNO属性值与之相等。
        D: 修改S表中的一个元组,照成SPJ表中表中某些元组的SNO属性值在表S中找不到一个元组,其SNO属性值与之相等。
        当上述不一致发生时,系统可以采用以下策略进行处理:
        A: 拒绝执行:默认
        B: 级联操作:当删除或修改照成表元组以参照表不一致时,则删除或修改参照表中照成不一致的元组。
        C: 设置为空值:当删除或修改照成表元组以参照表不一致时,则将参照表中照成不一致的元组设置为空。
        CREATE TABLE SPJ(SNO VARCHAR(10) FOREIGN KEY REFERENCES S(SNO)
               ON DELETE CASCADE //当删除S表中元组时,级联删除SPJ中相应元组
               ON UPDATE CASCADE,//当更新S表中元组时,级联更新SPJ中相应元组
                PNO VARCHAR(10) FOREIGN KEY REFERENCES P(PNO)
               ON DELETE NO ACTION //拒绝删除
               ON UPDATE CASCADE,
                JNO VARCHAR(10) FOREIGN KEY REFERENCES J(JNO),
                QTY INT,
                PRIMARY KEY(SNO, PNO, JNO));

四:用户定义的完整性
    1: 属性上的约束条件的定义
        在CREATE TABLE中定义属性的同时可以根据应用的要求,定义属性上的约束条件,即属性值限制。
        A: 列值非空(NOT NULL)
        B: 列值唯一(UNIQUE)
        C: 检查列值是否满足一个布尔表达式(CHECK)
            如性别:Ssex CHAR(2) CHECK(Ssex IN('男','女'));
            如成绩:Grade SMALLINT CHECK(Grade>=0 AND Grade<=100);
    2: 属性上的约束条件检查和违约处理:拒绝处理

五:完整性约束命名子句
    1: 完整性约束命名子句
        CONSTRAINT <完整性约束条件名> [PRIMARY KEY 短语|FOREIGN KEY 短语|CHECK短语]
        CREATE TABLE Student(
         Sno NUMERIC(6) CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),
         Sname CHAR(20) CONSTRAINT C2 NOT NULL,
         Sage NUMERIC(3) CONSTRAINT C3 CHECK(SaGE<30),
         Ssex CHAR(2) CONSTRAINT C4 CHECK(Ssex IN('男','女')),
         CONSTRAINT StudentKey PRIMARY KEY(Sno));
    2: 修改表中的完整性限制(ALTER)
        ALTER TABLE Student DROP CONSTRAINT C4;
        还可以通过删除原来的约束条件来增加新的约束条件。
        ALTER TABLE Student DROP CONSTRAINT C1;
        ALTER TABLE Student ADD CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 999999);

六:触发器
    触发器是用户定义在关系表上的一类时间驱动的特殊过程。
    一旦定义,任何用户对表的增删改操作均由服务器自动激活相应的触发器。
    1: 定义触发器
        CREATE TRIGGER <触发器名> |BEFORE|AFTER <触发事件> ON <表名>
            FOR EACH |ROW|STATEMENT| [WHEN <触发跳进>] <触发动作体>
        A: 表的拥有者即创建者才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器。
        B: 同一模式下,触发器名必须是唯一的。
        C: 当表的数据发生变化时,将激活定义在该表上相应<触发事件>的触发器,因此,该表也称为触发器的目标表。
        D: 触发事件可以是INSERT,DELETE或UPDATE,也可以是组合。
        E: 触发器可分为行级触发器(FOR EACH ROW)和语句级触发器(FOR EACH STATEMENT).
        F: 触发条件:
            触发器被激活时,只有当触发条件为真时触发动作体才执行,否则触发动作体不执行。
            如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行。
        G: 触发动作体:触发动作体可以是一个匿名PL/SQL过程块,也可以是对已创建存储过程的调用。

        H: 为教师表定义“教授工资不得低于4000,如果低于4000,自动改为4000”
            CREATE TRIGGER Insert_Or_Update_Sal  //在教师表上定义触发器
             BEFORE INSERT OR UPDATE ON Teacher //触发事件是插入或更新操作
             FOR EACH ROW      //行级触发器
             AS BEGIN       //定义触发体,过程块
              IF((new.pJob='教授') AND (new.Sal<4000))
              THEN new.Sal:=4000; //由于是行级触发器,可在过程体中使用插入或更新操作后的新值
              END IF;
             END;        //触发动作体结束
        I: 当教师工资发生变化时,就自动在工资变化表中增加一条相应的记录。
            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;
            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;
    2: 触发器激活:同一个表上多个触发器激活时遵循执行顺序如下:
        A: 执行该表上的BEFORE触发器,多个BEFORE触发器时,谁先创建谁先执行。
        B: 激活触发器的SQL语句
        C: 执行该表上的AFTER触发器
    3: 删除触发器
        DROP TRIGGER <触发器名> ON <表名>

 

原创粉丝点击