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