數據庫實驗——數據庫的完整性約束

  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觸發器起作用,它在更新前就生效,對要更新的值進行規則檢查。當檢查到與現有規則衝突時,系統給出錯誤消息,並取消更新操作。如果檢查沒有問題,更新被執行,再激活觸發器。

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