森林半岛 2022-05-28 12:37 采纳率: 81.8%
浏览 46
已结题

sqlserver触发器问题

问题遇到的现象和发生背景

创建“入库单”表的插入触发器。(有递归插入,需要自行建表,较难)。要求:假设图书馆购买图书后需要填写入库单,通过触发器的作用,能判断在“图书”表是否存在该图书的库存记录,如果是已经存在的图书(此次只是补充图书数量),则自动更新该图书的现有库存数量(增加),并将入库单中此条入库记录中的其余信息填写完整。若图书表中不存在该图书(新出版的书),则在“图书”表中自动插入该图书的记录(提示:图书表和入库单本来应该是一对多,但此种先插入子表的记录的操作是违反参照完整性的,所以不能先有外键关系,通过触发器维持主表和子表的图书自编号的一致性,即不会出现入库单的图书在图书表中不存在的情况)。

问题相关代码,请勿粘贴截图

```sql
create trigger 插入触发器 on 入库单
for insert
as
begin
declare @入库编号 int,@图书自编号 char(10),@ISBN char(15),@书名 char(255),@类别编号 char(10)
declare @作者 char(100),@出版社 char(50),@出版日期 date,@简介 varchar(200),@图书总量 int
declare @价格 money,@入库数量 int,@入库时间 datetime,@单价 money,@现有库存量 int,@最低库存量 smallint,@存放位置 char(50)
select @入库编号=入库单.入库编号,@图书自编号=inserted.图书自编号,@ISBN=inserted.ISBN,
       @入库数量=inserted.入库数量,@单价=inserted.单价,@书名=inserted.书名,
       @价格=入库单.价格,@入库数量=入库单.入库数量,@入库时间=入库单.入库时间
       from 图书 join inserted on inserted.图书自编号=图书.图书自编号
       join 入库单 on 入库单.图书自编号=inserted.图书自编号
select @现有库存量=现有库存量,
       @类别编号=类别编号,@作者=作者,@出版日期=出版日期,
       @简介=简介,@图书总量=图书总量,@最低库存量=最低库存量,
       @存放位置=存放位置,@图书自编号=图书自编号
       from 图书
if exists(select * from 图书 where @图书自编号=图书自编号)
begin
    update 入库单
    set 价格=@入库数量*单价,入库时间=getdate()
    where 入库编号=@入库编号
    update 图书
    set 现有库存量=现有库存量+@入库数量
    where 图书自编号=@图书自编号
end
if not exists(select * from 图书)
begin
    print'该图书是新入库图书!'
    update 入库单
    set 价格=@入库数量*单价,入库时间=getdate()
    where 入库编号=@入库编号
    update 图书
    set 图书自编号=@图书自编号,ISBN=@ISBN,书名=@书名,简介=NULL,图书总量=@入库数量,最低库存量=5,存放位置='四楼阅览室'
    where 图书自编号=图书自编号
end
end

###### 运行结果及报错内容 
修改了很多次,插入原图书表中存在的图书入库单记录是正确的,但是插入新入库的图书,触发器就不生效了
  • 写回答

1条回答 默认 最新

  • 吕布辕门 后端领域新星创作者 2022-05-28 13:07
    关注

    新插入的记录,其他表也要有数据,不然关联查不到数据,所以触发器无法触发

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月4日
  • 已采纳回答 6月2日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作