数据库完整性和MySQL触发器

理解触发器的概念、定义方法和触发条件。

 

二、实验的内容和步骤

  1. 删除sales表中作废的订单(其发票号码为I000000004),其订货明细数据也一并删除。(用外码实现相关操作)

alter table sales
add constraint FK_sales foreign key (order_no) references
sale_item(order_no);
update sales set invoice_no='I000000054' where invoice_no='I000000004';

数据库完整性和MySQL触发器_第1张图片

2、 创建一个employee表的insert触发器,设置一个会话变量,当有人操作其中数据时,给会话变量赋值,通过查看会话变量的值,验证是否有人插入数据。

create table timemap(

pen varchar(20)not null,

Time time not null,

primary key(pen,Time)

);



create trigger emp_trigger

on employee

after delete,insert,update

as

begin

insert into timemap

values(current_user,current_timestamp)

end;

数据库完整性和MySQL触发器_第2张图片

数据库完整性和MySQL触发器_第3张图片

触发器正常执行

3、 从sales表中删除一个订单信息的时候,自动完成sale_item表中对应的明细的删除。(提示:先删除sales表和sale-item表中的外键约束,否则该触发器无法成功执行。原因是?)。

alter table sale_item

drop constraint timemap.`PRIMARY`;

Create trigger salesTrigger

on sales

After delete as

begin

declare @order_no int

Select@order_no=order_no from deleted

Delete from sale_item where order_no=@order_no

End

原因是:被参照关系中删除元组的主码值出现在参照关系的外码中,系统拒绝该操,所以要给出级联CASCADE操作的显示定义。

触发器正常执行

4、 针对employee表写一个UPDATE触发器,当修改后的薪水值小于1000时,自动修改为1000。

create trigger UP_DATE



on employee



after insert,update



as



begin



declare @emp_no nvarchar (5)



select @emp_no = emp_no from inserted where salary<1000;



update employee set salary=1000 where emp_no=@emp_no



end

数据库完整性和MySQL触发器_第4张图片

触发器正常执行

5、 建立sale_statics表用于记录每个员工的目前为止销售总业绩。该表由emp_no和money_saled两列,设置合理的属性数据类型。首先,将sales表中已有的销售信息存入sale_statics表,然后,创建一个触发器,每当sales表中插入新的销售记录时,如果是新员工,增加销售总额记录,如果已经存在销售记录时,则更新该员工的销售总业绩。(提示:可用上if语句来判断某员工是否存在于sale_statics表中)

create table totmap(

emp_no nvarchar (5)Not null primary key,

Total_sales_amount numeric(9,2)Not null

)

insert into totmap

select Sale_id,SUM(tot_amt) Total_sales_amount

from sales

group by Sale_id

create trigger static_sale on sales

after insert

as

begin

declare @Sale_id nvarchar (5),@tot_amt numeric(9,2)



select@Sale_id=Sale_id,@tot_amt=tot_amt from inserted

if(@Sale_id in (select emp_no from totmap))

update totmap set Total_sales_amount=Total_sales_amount+@tot_amt where emp_no=@Sale_id

else

insert into totmap(emp_no,Total_sales_amount)

select Sale_id,tot_amt

from inserted

end

drop trigger static_sale;

insert into sales

values ('10006','C0003','E0014','33000.00','1996-11-10

00:00:00','I000000004');

insert into sales

values ('10005','C0003','E0018','33000.00','1996-11-10

00:00:00','I000000004')

数据库完整性和MySQL触发器_第5张图片

数据库完整性和MySQL触发器_第6张图片

触发器正常执行

你可能感兴趣的:(数据库,mysql)