我正在为图书馆项目创建数据库,该图书馆项目在未归还插入的书籍时必须给出错误

问题描述

我的任务是为学校项目建立示例图书馆数据库。到目前为止,几乎所有事情都已完成,除了,我需要创建一个触发器,当图书馆管理员试图检出前贷方尚未归还的书时将触发该触发器。 这是称为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'的插入。

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

解决方法

您的查询需要使用INSERTED.MediaID来找到同时满足两个条件的LenderRecord

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

但是,此操作仅在INSERT上有效,因此您的触发器应仅在INSERT上触发,而不应在UPDATE上触发。
如果您在UPDATE上触发触发器,则永远无法设置DateReturned,因为触发器会阻止它。

也可以考虑保留DateReturned为NULL,直到您有一个有效的日期并为查询中的DateReturned IS NULL过滤为止。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...