首页 > 解决方案 > 我正在为一个图书馆项目创建一个数据库,当插入的书未归还时,该项目必须给出错误

问题描述

我的任务是为一个学校项目构建一个示例图书馆数据库。到目前为止,几乎所有事情都已完成,除了,我需要创建一个触发器,当图书管理员试图检查一本书之前的贷方尚未归还时触发该触发器。这是调用表的代码,LenderRecord它应该以上述插入为条件。

CREATE TABLE LenderRecord
(
RecordID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
MediaID INT,
LenderID INT,
DateTaken DATE NOT NULL,
DateReturned DATE, --YYYY-MM-DD FORMAT!
Reservation NVARCHAR(20),
FineAmtDue MONEY DEFAULT '0',
FineAmtPaid MONEY DEFAULT '0'
);

触发器的代码:请记住,我是 SQL 新手...

CREATE TRIGGER trig_BookNotReturned  --This trigger fires when a mediaid is being inserted that has 
not bee returned by the previous lender.
ON LenderRecord
AFTER INSERT, UPDATE 
AS
BEGIN
    IF EXISTS( SELECT MediaID FROM inserted WHERE DateReturned = '1900-01-01' )
    BEGIN
        ROLLBACK TRANSACTION
        RAISERROR ('This book has not been returned yet', 16, 1)
    END
END
GO

但是,当我执行此触发器并将数据插入表中时,它仅捕获具有DateReturned不是“1900-01-01”的插入。

请问有人可以给我一个更好的方法吗?谢谢

标签: sqlsql-server-2019

解决方案


您的查询需要使用INSERTED.MediaID来查找LenderRecord两个条件都适用的地方:

IF EXISTS( SELECT MediaID FROM LenderRecord WHERE MediaID = INSERTED.MediaID AND DateReturned = '1900-01-01' )

但是,这只会起作用,INSERT因此您的触发器应该只触发INSERT,而不是触发UPDATE
如果您在 上触发触发器UPDATE,您将永远无法设置 ,DateReturned因为您的触发器会阻止它。

还可以考虑保留DateReturnedNULL,直到您在查询中有一个有效的日期和过滤器DateReturned IS NULL


推荐阅读