- 數據完整性。使用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 - 以實驗數據庫爲基礎數據,編寫以下觸發器並測試。
- 爲表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觸發器起作用,它在更新前就生效,對要更新的值進行規則檢查。當檢查到與現有規則衝突時,系統給出錯誤消息,並取消更新操作。如果檢查沒有問題,更新被執行,再激活觸發器。