数据库完整性试验

一、定义一个教师表Teacher(Tno,TName,TSex,TAge,TSal,TJob,TDept)
要求:
    1、性别只能是‘男’或‘女’
    2、Tno为主码,名字不能为空,且不能重复。
    3、年龄在18在60岁之间
    4、教授工资最低为5000(触发器完成)
    5、Tdept为外码,参照DEPT表。当DEPT表删除元组时,相对应Teacher元组拒绝删除;修改时,相对应Teacher元组同时修改。
二、定义记录表Record(RNo,TNo,ROldSal,RNewSal,RUser,RTime)
要求:
    1、RNo从1开始,每次加1为。主码
    2、TNo为外码,参照Teacher表。
第一题和第二题参考:

 


use SC
go
/*-------------系表-----------------------------*/
create table Dept
(TDept char(10) primary key);
go

/*-------------教师表-----------------------------*/
create table Teacher
(TNo char(10) primary key,
TName char(10) not null,
TSex char(2)check(TSex in('男','女')),
TAge smallint check(TAge>=18 and TAge<=60),
TSal numeric(7,2),
TJob varchar(10),
TDept char(10),
foreign key (TDept) references Dept(TDept)on delete no action   on update cascade);  
go   

 

/*-----教授工资不低于5000触发器-----------------*/ 
create trigger Teacher_JiaoShou_MINSal 
on  Teacher 

for Insert,Update as 

set Nocount off
/*---------定义变量----------------------*/
declare 
 @TNo char(10),
 @NewSal numeric(7,2),
 @Tjob char(10)
begin
 /*---------获得变量值----------------------*/
 select @TNo=TNo,
 @NewSal=TSal,
 @Tjob=Tjob 
 from inserted 

 /*---------判断是否是教授,且工资小于5000----------------------*/
 if (((@NewSal-5000)<0) and (@Tjob='教授'))
  begin
   /*---------修改该员工(教授Tno)表----------------------*/
   update Teacher 
   set Tsal=5000
   where Tno=@Tno
  end
end


/*-------------记录表-----------------------------*/
create table Record
(RNo  int  identity (1,1) primary key,
TNo char(10) references Teacher(TNo),
ROldSal numeric(7,2),
RNewSal numeric(7,2),RUser char(10), RTime Datetime);
go    


三、定义触发器
    1、触发器Insert_Teacher,当插入Teacher一行元组时,记录教师编号TNo,等数据信息,插入到表Record中。ROldSal为0。

参考:

 


/*-----插入Teacher触发器-----------------*/ 
create trigger Insert_Teacher 
on  Teacher 

for Insert as 

set Nocount off
/*---------定义变量----------------------*/
declare 
 @TNo char(10),
 @RNewSal numeric(7,2)
begin
 /*---------获得变量值----------------------*/
 select @TNo=TNo,
 @RNewSal=TSal 
 from inserted 
 /*---------插入要记录的数据到Record表----------------------*/
 insert into Record(TNo,ROldSal,RNewSal,RUser,RTime) values(@TNo,0,@RNewSal,current_user,current_timestamp)
end

测试数据:

insert into dept
values('信息工程系')
insert into teacher
values ('2008001','wang','男',34,2000,'讲师','信息工程系')
select * from teacher

 


    2、触发器Update_Teacher,当修改Teacher数据时,若工资发生变动,记录变动情况到Record表。

参考:

 

 

/*-----更新Teacher触发器-----------------*/ 
create trigger Update_Teacher 
on  Teacher 

for update as 

set Nocount off
/*---------定义变量----------------------*/
declare 
 @TNo char(10),
 @ROldSal numeric(7,2),
 @RNewSal numeric(7,2)

begin
 /*---------获得变量值----------------------*/
 select @TNo=TNo,
 @ROldSal=TSal
 from deleted 

 select @TNo=TNo,
 @RNewSal=TSal 
 from inserted 
 /*---------插入要记录的数据到Record表----------------------*/
 insert into Record(TNo,ROldSal,RNewSal,RUser,RTime) values(@TNo,@ROldSal,@RNewSal,current_user,current_timestamp)
end


测试:

update teacher
set tsal=3000
where tno='2008001'

select * from record


    3、(课下完成)触发器Delete_Teacher,当删除Teacher数据时,记录删除情况到Delete_teacher表。记录教师所有信息和用户及删除时间。

参考:


    4、完成以上触发器的测试。

 

 

说明:

1.能够触发Insert_Teacher触发器的,有对Teacher表进行Insert操作和Update操作。

2.能够触发Delete_Teacher触发器的,有对Teacher表进行Delete操作和Update操作。

3.能够触发Update_Teacher触发器的,只有有对Teacher表进行Update操作

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值