数据库实验——数据库的完整性约束

  1. 数据完整性。使用T-SQL语句完成以下内容。
    1)将数据库stu的表course的cno字段定义为主键,约束名称为cno_pk;
    USE student
    ALTER TABLE XSKC.course
    ADD CONSTRAINT cno_pk PRIMARY KEY(cno)
    2)为表course中的字段cname添加唯一值约束;
    USE student
    ALTER TABLE XSKC.course
    ADD CONSTRAINT cname_pk UNIQUE(cname)
    3)对于数据表sc的sno、cno字段定义为外码,使之与表student的主码sno及表course的主码cno对应,实现如下参照完整性:
    删除student表中记录的同时删除sc表中与该记录sno字段值相同的记录;
    修改student表某记录的sno时,若sc表中与该字段值对应的有若干条记录,则拒绝修改;
    修改course表cno字段值时,该字段在sc表中的对应值也应修改;
    删除course表一条记录时,若该字段在在sc表中存在,则删除该字段对应的记录;
    向sc表添加记录时,如果该记录的sno字段的值在student中不存在,则拒绝插入;
    ALTER TABLE XSKC.sc
    ADD CONSTRAINT sc_fk FOREIGN KEY (sno) REFERENCES XSKC.student(sno) on delete cascade on update no action,
    FOREIGN KEY (cno) REFERENCES XSKC.course(cno) on delete cascade on update cascade
    Go
    4)定义check约束,要求学生学号sno必须为9位数字字符,且不能以0开头,第二三位皆为0;
    ALTER TABLE XSKC.student
    ADD CONSTRAINT sno_ck
    CHECK(sno like ‘[1-9]00[0-9][0-9][0-9][0-9][0-9][0-9]’)
    5)定义stu数据库中student表中学生年龄值在16~25范围内;
    ALTER TABLE XSKC.student
    ADD CONSTRAINT sage_ck
    CHECK(sage between 18 and 30)
    6)定义stu数据库student表中学生年龄值默认值为20;
    ALTER TABLE XSKC.student
    ADD CONSTRAINT sage_df
    DEFAULT 20 FOR sage
    7)修改student表学生的年龄值约束可以为15~30范围内;
    ALTER TABLE XSKC.student
    DROP CONSTRAINT sage_ck
    go
    ALTER TABLE XSKC.student
    ADD CONSTRAINT sage_ck
    CHECK(sage >= 15 AND sage <= 30)
    8) 删除表course中字段cname的唯一值约束;
    USE student
    ALTER TABLE XSKC.course
    DROP CONSTRAINT cname_pk
  2. 以实验数据库为基础数据,编写以下触发器并测试。
  1. 为表course建立一个 INSERT触发器,当插入的新行中课程学分(ccredit)的值不是1~6时,就激活该出发器,撤销该插入操作,并使用RAISERROR语句返回一个错误信息。
    CREATE TRIGGER tri_INSERT_course ON XSKC.course
    FOR INSERT
    AS
    DECLARE @ccredit tinyint
    SELECT @ccredit=XSKC.course.ccredit
    FROM XSKC.course,inserted
    WHERE XSKC.course.ccredit=inserted.ccredit
    IF @ccredit NOT BETWEEN 1 AND 6
    BEGIN
    ROLLBACK TRANSACTION
    RAISERROR(‘插入课程学分不在~6之间’,16,10)
    END
    2)为course表再创建一个UPDATE触发器,当更新了某门课程的课程号信息时,就激活该触发器级联更新sc表中相关的课程号信息,并使用PRINT语句返回一个提示信息。
    CREATE TRIGGER tri_UPDATE_course ON XSKC.course
    FOR UPDATE
    AS
    IF UPDATE(cno)
    BEGIN
    DECLARE @oldcno char(3),@newcno char(3)
    SELECT @oldcno=deleted.cno,@newcno=inserted.cno
    FROM deleted,inserted
    WHERE deleted.cno=inserted.cno
    PRINT ‘准备级联更新XSKC.sc表中的课程号信息……’
    UPDATE XSKC.sc
    SET cno=@newcno
    WHERE cno=@oldcno
    PRINT ‘已经级联更新XSKC.sc表中原课程号’+@oldcno+‘为’+@newcno
    END
    3)为student表创建DELECT触发器,在删除中的一条记录的同时将sc表中的相应记录也删除。
    CREATE TRIGGER tri_student on XSKC.student
    AFTER DELETE
    AS
    BEGIN
    DELETE FROM sc
    WHERE sno=(SELECT sno FROM deleted)
    END
    4)创建INSTEAD OF触发器,当向sc表中插入记录时,先检查sno列上的值在student中是否存在,如果存在执行插入操作,如果不存在则提示“该学生不存在”。
    CREATE TRIGGER tri_sc
    ON XSKC.sc AFTER INSERT
    AS
    BEGIN
    IF(SELECT COUNT(*) FROM inserted JOIN XSKC.student ON inserted.sno=student.sno)=0
    BEGIN
    ROLLBACK TRAN
    PRINT ‘该学生不存在!’
    END
    END
    5)比较约束与触发器的执行顺序。(在一个表中创建CHECK约束和触发器,然后向表中插入一条不符合约束和触发器的记录,察看谁先发生作用。)
    ALTER TABLE XSKC.course
    ADD CONSTRAINT CK_ccredit
    CHECK (ccredit >= 1 AND ccredit <= 6)

INSERT XSKC.course
values(‘10’,‘数据库’,‘5’,7)
在这里插入图片描述
从实验可以看出,约束优先于for或after触发器起作用,它在更新前就生效,对要更新的值进行规则检查。当检查到与现有规则冲突时,系统给出错误消息,并取消更新操作。如果检查没有问题,更新被执行,再激活触发器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章