理解触发器的概念、定义方法和触发条件。
二、实验的内容和步骤
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';
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;
触发器正常执行
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
触发器正常执行
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')
触发器正常执行