sql - 我正在为一个图书馆项目创建一个数据库,当插入的书未归还时,该项目必须给出错误
问题描述
我的任务是为一个学校项目构建一个示例图书馆数据库。到目前为止,几乎所有事情都已完成,除了,我需要创建一个触发器,当图书管理员试图检查一本书之前的贷方尚未归还时触发该触发器。这是调用表的代码,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
。
推荐阅读
- laravel - 在 Laravel 上成功认证后得到 401
- python - Python:为什么我不能在 if 循环之外调用方法
- reactjs - 通过 React Native Paper 主题化
- javascript - 内容安全策略:页面设置阻止在 blob 处加载资源(使用 createObjectURL 无法进行图像预览)
- javascript - 如何验证只有 2 位数字的输入数字并允许用户使用 JQuery 输入点数字?
- java - 关于 IDEA 中的路径。和别人比起来不一样
- javascript - 从父组件到子组件的角度传递数据?
- javascript - 如何在 Vue 中循环播放两个音频片段?
- summernote - Summernote 应用 Bullet 后行间距发生变化
- node.js - 如何从给定的代码行中获取 id?