use Trig;
create table 产品(
产品编号 char(6) not null primary key,
产品名称 varchar(30) not null,
价格 int not null,
库存 int not null);
create table 客户(
客户编号 char(6) not null primary key,
客户名 varchar(30) not null,
地区 varchar(30) not null,
负责人 varchar(30) not null,
电话 varchar(13) not null);
create table 销售(
产品编号 char(6) not null,
产品名称 varchar(30) not null,
客户编号 char(6) not null,
客户名 varchar(30) not null);
use Trig;
insert into 产品 values ('1','皮鞋',1000,200);
insert into 产品 values ('2','T恤',1000,200);
insert into 产品 values ('3','牛仔裤',1000,200);
insert into 产品 values ('4','围巾',1000,200);
insert into 产品 values ('5','夹克',1000,200);
insert into 客户 values ('1','用户A','北京','小张','123456');
insert into 客户 values ('2','用户B','上海','小王','123456');
insert into 客户 values ('3','用户C','广州','小李','123456');
insert into 客户 values ('4','用户D','深圳','小赵','123456');
insert into 客户 values ('5','用户E','香港','小周','123456');
在产品销售表建立触发器,进行插入操作,保证产品编号与产品表中的对应字段一致,客户编号与客户表中对应字段一致,保证销售表中主键不能重复。设计触发器的程序流程,注意给出适当的提示信息。
激发触发器(提示,可以先取消主键和外键约束)。
CREATE TRIGGER tri_insert
on 销售
for insert
as
begin
declare @cpnum char(6)
set @cpnum=(select inserted.产品编号 from inserted)
declare @cmnum char(6)
set @cmnum=(select inserted.客户编号 from inserted)
if(@cpnum not in(select 产品编号 from 产品))
begin
print'插入数据中产品编号和产品表中的不一致,插入失败'
print @cpnum
rollback
end
else if(@cmnum not in(select 客户编号 from 客户))
begin
print'插入数据中客户编号和客户表中的不一致,插入失败'
print @cmnum
rollback
end
else
print'插入成功!'
end
验证:
insert into 销售
values('1','皮鞋','6','小红')
从图中可以发现触发器起作用了,当客户不存在时,销售添加被终止。
当条件满足时,则可以顺利添加
insert into 销售
values('1','皮鞋','1','小张')
在客户表建立触发器,进行删除操作,保证删除客户记录时,查询销售表中相应的记录,如果销售表中没有相应客户的信息,才允许删除。设计触发器的程序流程,注意给出适当的提示信息。
激发触发器(提示,可以先取消外键约束)。
CREATE TRIGGER Tri_Cus_Del
on 客户
for delete
as
begin
declare @cmnum char(6)
set @cmnum=(select deleted.客户编号 from deleted)
if(@cmnum is null)
begin
print'该客户不存在,删除失败'
end
else if(@cmnum in(select 客户编号 from 销售))
begin
print'销售表中存在该用户的记录,删除失败'
print '客户编号为'+@cmnum
rollback
end
else
print'删除成功'+'客户编号为:'+@cmnum
end
select * from 销售
select * from 客户
delete from 客户
where 客户编号='1'
对于内容1的功能,单纯使用约束进行实现。对于内容2,设计约束,实现删除客户记录的同时,级联删除销售表中相应的记录。
CREATE TRIGGER tri_res
on 客户
for insert,delete
as
begin
declare @cmnum char(6)
set @cmnum=(select deleted.客户编号 from deleted)
if(@cmnum is null)
begin
print'该客户不存在,删除失败'
end
else if(@cmnum in(select 客户编号 from 销售))
begin
print'销售表中存在该用户的记录,级联删除销售表中数据'
print '客户编号为'+@cmnum
delete from 销售 where 客户编号=@cmnum
end
else
print'删除成功'+'客户编号为:'+@cmnum
end
验证:
delete from 客户
where 客户编号='1'
select *from 客户
select * from 销售
将之前的 Tri_Cus_Del触发器 删除,使用 tri_res ,完成对两个表的操作。
set @cpnum=(select inserted.产品编号from inserted)
这里的inserted
表示的是在进行触发器的时候,系统自动创建的临时表。
经过这次试验让我更深入的了解到触发器的用途以及触发器的使用,刚开始不知道从何出下手,最后查书才搞明白如何解决,通过努力解决这几道题,让我明白如何实现触发器的定义,以及对一些事件的处理过程,如何对表和视图进行创建触发器,以及如何完成相关的级联操作,虽然花费了不少时间,但很有收获。