sql server 触发器
程序员文章站
2022-03-09 09:17:48
...
一.实验目的
- 理解触发器的作用和工作机制;
- 熟练掌握触发器创建和运用;
二.实验内容及要求
- 创建和执行触发器
- 添加用于添加的触发器
- 添加用于删除的触发器
- 用约束实现触发器
三.实验过程及结果
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);
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');
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','小红')
从图中可以发现触发器起作用了,当客户不存在时,销售添加被终止。
当条件满足时,则可以顺利添加
insert into 销售
values('1','皮鞋','1','小张')
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
验证:
select * from 销售
select * from 客户
delete from 客户
where 客户编号='1'
当销售表中有客户信息的时候,客户不能从客户表中删除。
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 销售
将之前的 Tri_Cus_Del触发器 删除,使用 tri_res ,完成对两个表的操作。
四.疑惑点
set @cpnum=(select inserted.产品编号from inserted)
这里的inserted
表示的是在进行触发器的时候,系统自动创建的临时表。
五.实验中的问题及心得
经过这次试验让我更深入的了解到触发器的用途以及触发器的使用,刚开始不知道从何出下手,最后查书才搞明白如何解决,通过努力解决这几道题,让我明白如何实现触发器的定义,以及对一些事件的处理过程,如何对表和视图进行创建触发器,以及如何完成相关的级联操作,虽然花费了不少时间,但很有收获。
上一篇: week09_day03_索引02
下一篇: PHP中的魔术方法和魔术常量
推荐阅读
-
使用Docker运行Microsoft SQL Server 2017的方法
-
Dapper use Table Value Parameter in C# (Sql Server 数组参数)
-
小程序server请求微信服务器超时的解决方法
-
Windows Server 2016 build 10514系统截图曝光
-
彻底完全卸载 SQL Server 2005 的图文教程
-
彻底卸载SQL 2005图文教程
-
SQL SERVER数据库清空日志图文教程分享
-
VS2008连接SQL Server数据库文件出错的解决方法
-
SUSE Linux Enterprise Server 设置防火墙开启ssh远程端口的方法
-
SQL中Charindex和Oracle中对应的函数Instr对比