sql server 触发器

一.实验目的

  1. 理解触发器的作用和工作机制;
  2. 熟练掌握触发器创建和运用;

二.实验内容及要求

  1. 创建和执行触发器
  2. 添加用于添加的触发器
  3. 添加用于删除的触发器
  4. 用约束实现触发器

三.实验过程及结果

1.先三个表

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);

sql server 触发器_第1张图片

2.添加点数据

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');

sql server 触发器_第2张图片

3. 创建和执行触发器

在产品销售表建立触发器,进行插入操作,保证产品编号与产品表中的对应字段一致,客户编号与客户表中对应字段一致,保证销售表中主键不能重复。设计触发器的程序流程,注意给出适当的提示信息。
激发触发器(提示,可以先取消主键和外键约束)。

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','小红') 

sql server 触发器_第3张图片

从图中可以发现触发器起作用了,当客户不存在时,销售添加被终止。
当条件满足时,则可以顺利添加

insert into 销售
values('1','皮鞋','1','小张') 

sql server 触发器_第4张图片

4. 删除触发器的设计和触发

在客户表建立触发器,进行删除操作,保证删除客户记录时,查询销售表中相应的记录,如果销售表中没有相应客户的信息,才允许删除。设计触发器的程序流程,注意给出适当的提示信息。
激发触发器(提示,可以先取消外键约束)。

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

sql server 触发器_第5张图片
验证:

select * from 销售
select * from 客户
delete from 客户
where 客户编号='1'

sql server 触发器_第6张图片
sql server 触发器_第7张图片
当销售表中有客户信息的时候,客户不能从客户表中删除。

5. 用约束实现触发器

对于内容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 销售

sql server 触发器_第8张图片
sql server 触发器_第9张图片
将之前的 Tri_Cus_Del触发器 删除,使用 tri_res ,完成对两个表的操作。

四.疑惑点

set @cpnum=(select inserted.产品编号from inserted)

这里的inserted 表示的是在进行触发器的时候,系统自动创建的临时表。

五.实验中的问题及心得

经过这次试验让我更深入的了解到触发器的用途以及触发器的使用,刚开始不知道从何出下手,最后查书才搞明白如何解决,通过努力解决这几道题,让我明白如何实现触发器的定义,以及对一些事件的处理过程,如何对表和视图进行创建触发器,以及如何完成相关的级联操作,虽然花费了不少时间,但很有收获。

你可能感兴趣的:(SQL,Server)