森林半岛
2022-05-28 12:37
采纳率: 100%
浏览 19

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条回答 默认 最新

相关推荐 更多相似问题