數據完整性:學生管理系統練習

前言:

這次試驗報告搞的心態爆炸,還好有大哥在。

直接進入正題:

1.在studentsdb數據庫中用CREATE TABLE語句創建表stu_con,並同時創建約束。
(1)創建表的同時創建約束。表結構如圖1所示。
在這裏插入圖片描述
圖1 要創建的表的結構
約束要求如下:
① 將學號設置爲主鍵(PRIMARY KEY),主鍵名爲pk_sid。
② 爲姓名添加唯一約束(UNIQUE),約束名爲uk_name。
③ 爲性別添加默認約束(DEFAULT),默認名稱爲df_sex,其值爲“男”。
④ 爲出生日期添加屬性值約束(CHECK),約束名爲ck_bday,其檢查條件爲:出生日期>‘1988-1-1’。
(2)使用ALTER TABLE語句的DROP CONSTRAINT刪除爲stu_con表所建的約束。

2.爲studentsdb數據庫的grade表添加外鍵約束(FOREIGN KEY),要求將“學號”設置爲外鍵,參照表爲student_info,外鍵名稱爲fk_sid;爲student_info表的“性別”添加默認約束,值爲’男’。

3.爲grade表建立一個名爲insert_g_tr 的INSERT觸發器,當用戶向grade表中插入記錄時,如果插入的是在curriculum表中沒有的課程編號,並且插入的是student_info表中沒有的學號,則提示用戶不能插入記錄,否則提示記錄插入成功。
變量定義:DECLARE @kcbh varchar(8)
提示:記錄插入成功對應的語句爲“PRINT ‘記錄插入成功’”
提示:不能插入記錄對應的語句爲“RAISERROR(‘不能插入記錄’,16,1)”

4.爲curriculum表創建一個名爲del_c_tr的DELETE觸發器,該觸發器的作用是禁止刪除curriculum表中的記錄。

5.爲student_info表創建一個名爲update_s_tr的UPDATE觸發器,該觸發器的作用是禁止更新student_info表中的“姓名”字段的內容。

6.爲student_info表建立刪除觸發器del_s_tr,要求當student_info表的記錄被刪除後,grade表中相應的記錄也能自動刪除。

7.基於student_info表、curriculum表和grade表,建立一個名爲v_stu_g的視圖,視圖中具有所有學生的學號、姓名、課程編號、課程名稱、分數。爲視圖v_stu_g建立插入操作的instead of 觸發器,當針對v_stu_g插入記錄時,實際上分別向student_info表、curriculum表和grade表插入一條記錄:student_info(學號,姓名),curriculum(課程編號,課程名稱),grade(學號,課程編號,分數)。

8.使用Transact-SQL語句DROP TRIGGER刪除update_s_tr觸發器。

1.
CREATE TABLE stu_con
(
學號char(4),
姓名char(8),
性別char(2),
出生日期datetime,
家庭地址varchar(50),
constraint pk_sid primary key (學號),
constraint uk_name unique (姓名),
constraint ck_bday check (出生日期>'1988-1-1')
)

alter table stu_con
add constraint df_sex default '男' for 性別

2.
alter table grade
	add constraint fk_sid foreign key(學號)references student_info(學號)

alter table student_info
	add constraint df_sex default '男' for 性別
	
3.
create trigger insert_g_tr on grade
for insert as

begin 
	declare @errcno char(4),@errsno char(4)
	select @errcno=課程編號,@errsno=學號from inserted
	if(@errcno not in (select 課程編號from curriculum) or @errsno not in (select 學號from student_info))
		begin
		raiserror('不能插入記錄',16,1)
		rollback transaction
		end
	else
		print '記錄插入成功'
end

4.
create trigger del_c_tr on curriculum
for delete as
begin
	rollback transaction
end

5.
create trigger update_s_tr on student_info
instead of update
as if update(姓名)
print('禁止更新')
begin
	rollback transaction
end

6.
create trigger del_s_tr on student_info
after delete as
begin
	declare @stuno char(4)
	select @stuno = 學號from deleted
	delete from grade where 學號=@stuno
end

7.
create trigger v_stu_g_tr on v_stu_g instead of insert
as
begin 
	declare @sno char(4),@name char(4),@cno char(4),@cn char(50),@stugrade real
	select @sno = 學號,@name=姓名,@cno=課程編號,@cn=課程名稱,@stugrade=分數from inserted
	insert into student_info(學號,姓名) values(@sno,@name)
	insert into curriculum(課程編號,課程名稱) values(@cno,@cn)
	insert into grade(學號,課程編號,分數) values(@sno,@cno,@stugrade)
end

8.
drop trigger update_s_tr

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