2

我有以下数据库表:

Book {Id(primary Key), Name, TotalNoOfCopies, NoOfCopiesAvailable}

我希望每当插入新记录/行时,NoOfCopiesAvailabe 列包含与 TotalNoOfCopies 列中相同的值。
我尝试使用以下成功触发器:

for insert
as declare @id nvarchar(10),@name varchar(50),@author varchar(40),@totalNoOfCopies tinyint, @availableNoOfCOpies tinyint;
select @id=i.Id from inserted i;
select @name=i.Name from inserted i;
select @author=i.Author from inserted i;
select @totalNoOfCopies=i.TotalNoOfCopies from inserted i;
select @availableNoOfCopies=i.TotalNoOfCopies from inserted i;
delete from Book where Id=@id;
insert into Book values(@id,@name,@author,@totalNoOfCopies,@availableNoOfCOpies);

但它执行 3 个事务:
1.用于插入新记录
2.用于删除该新记录
3.用于插入具有 NoOfCopiesAvailable=TotalNoOfCopies 的新记录

例如:

Insert into Book values('123','Book','Author',5,null)

消息:
1 行受影响
1 行受影响
1 行受影响


我想知道是否有任何方法可以在单个事务中执行此操作?

4

2 回答 2

0

您是否需要 INSTEAD OF INSERT 触发器:

CREATE TRIGGER Book_i ON Book
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO Book (
        Id,
        Name,
        TotalNoOfCopies, 
        NoOfCopiesAvailable
    ) SELECT
        Id,
        Name,
        TotalNoOfCopies,
        TotalNoOfCopies
    ) FROM
        INSERTED
END
GO

显然是一种优雅。

于 2013-10-14T07:57:44.343 回答
0

我宁愿修复表格设计并使用 NumberOfCopiesSold 代替,默认情况下可以为 0。

于 2013-10-14T07:58:16.100 回答