欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sql server 触发器

程序员文章站 2022-03-09 09:17:48
...

一.实验目的

  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 触发器

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 触发器

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 触发器

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

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

sql server 触发器

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 '客户编号为'aaa@qq.com
            rollback
        end 
    else
        print'删除成功'+'客户编号为:'aaa@qq.com
end

sql server 触发器
验证:

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

sql server 触发器
sql server 触发器
当销售表中有客户信息的时候,客户不能从客户表中删除。

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 '客户编号为'aaa@qq.com
            delete from 销售 where 客户编号aaa@qq.com
        end 
    else
        print'删除成功'+'客户编号为:'aaa@qq.com
end

验证:

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

sql server 触发器
sql server 触发器
将之前的 Tri_Cus_Del触发器 删除,使用 tri_res ,完成对两个表的操作。

四.疑惑点

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

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

五.实验中的问题及心得

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