【发布时间】:2019-09-17 14:37:25
【问题描述】:
我觉得我应该能够做到
SET @InsertCount = COUNT (*) FROM INSERTED WHERE ISBN = @ISBN
但它不会让我。我尝试使用 SELECT 语句,因为我看到其他人在线使用它,但我不知道还能做什么。
IF OBJECT_ID ('BooksTrigger') IS NOT NULL
DROP TRIGGER BooksTrigger
GO
-- create the trigger
CREATE TRIGGER BooksTrigger
ON Books
INSTEAD OF INSERT
AS
DECLARE @ISBN INT,
@BookInDate DATE,
@Memo VARCHAR(100),
@Copies INT,
@PreyQty INT,
@InsertISBNCount INT,
@CurrQty INT
SET @InsertISBNCount = (SELECT COUNT(ISBN) FROM inserted WHERE ISBN = @ISBN)
SET @PreyQty = (SELECT COUNT(ISBN) FROM Books WHERE ISBN = @ISBN)
SET @CurrQty = (SELECT SUM(@InsertISBNCount + @PreyQty))
SET @Copies = (SELECT CopiesNo FROM BookInfo WHERE ISBN = @ISBN)
IF @Copies > @CurrQty
BEGIN
PRINT 'Inserting a copy of the book with ISBN ' + @ISBN
INSERT INTO Books (ISBN, BookInDate, Memo)
VALUES (@ISBN, @BookInDate, @Memo)
END
ELSE
THROW 50027, 'Number of copies available for this book is less than the inserts for this book. Insert did not go through.', 1
GO
-- test
BEGIN TRY
INSERT INTO Books
VALUES ('9780393248968', GETDATE(), 'test') --should print 'inserting'
INSERT INTO Books
VALUES ('9780393248968', GETDATE(), 'test') --this one should throw an error as this would be the fifth book
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
END CATCH
--see if the first one inserted
SELECT * FROM Books
所以这里的目标是创建一个 INSTEAD OF 触发器,用于在 Books 表中插入数据。我想查看插入到 Books 表中的 ISBN 的书籍数量是否超过 BookInfo 中相同 ISBN 的 CopiesNo,抛出错误,否则插入带有打印消息“正在插入...”或其他内容的数据。
我被告知完成后我应该看到这样的消息:
但我目前得到这个:
这是制作两个表(Books AND BookInfo)的代码
--BookInfo Table
CREATE TABLE BookInfo
(
ISBN BIGINT PRIMARY KEY CHECK (LEN([ISBN]) BETWEEN 10 AND 13),
BookCategoryID INT,
BookName VARCHAR(60),
BookAuthor VARCHAR(40),
BookPublisher VARCHAR(40),
BookPubDate DATE,
BookPages INT CHECK (BookPages > 0),
BookPrice INT CHECK (BookPrice > 0),
CopiesNo INT DEFAULT 1 CHECK (CopiesNo > 0),
Memo VARCHAR(100) NULL,
);
--Books Table
CREATE TABLE Books
(
BookID INT PRIMARY KEY IDENTITY(1,1),
ISBN BIGINT,
BookInDate DATE,
Memo VARCHAR(100) NULL,
);
GO
ALTER TABLE Books
ADD FOREIGN KEY (ISBN) REFERENCES BookInfo(ISBN);
GO
INSERT INTO BookInfo (ISBN, BookCategoryID, BookName, BookAuthor,BookPublisher, BookPubDate, BookPages, BookPrice, CopiesNo, Memo)
VALUES (9780393248968, 1, 'Storm in a Teacup: The Physics of Everyday Life', 'Helen Czerski', 'W. W. Norton & Company', '01/10/2017', 288, 26.95, 4, 'On sale'),
(9780062328502, 1, 'Dark Matter and the Dinosaurs: The Astounding', 'Lisa Randall', 'Ecco', '10/18/2016', 432, 17.99, 2, 'Not on Sale'),
(9780262517263, 2, 'Grace Hopper and the Invention of the Information Age', 'Kurt Beyer', 'MIT Press', '02/01/2012', 404, 27.95, 2, 'On sale');
INSERT INTO Books (ISBN, BookInDate, Memo)
VALUES (9780393248968, '01/01/2018', 'this is a book'),
(9780393248968, '01/01/2018', 'this is a book'),
(9780393248968, '01/01/2018', 'this is a book'),
(9780062328502, '01/02/2018', 'this is a book I think'),
(9780062328502, '01/02/2018', 'this is a book I think'),
(9780262517263, '01/03/2018', 'this is a book for sure'),
(9780262517263, '01/03/2018', 'this is a book for sure');
【问题讨论】:
-
当我说“错误”时,它只是应该吐出一条错误消息,说它不起作用,但我在运行代码后添加了消息框所说的内容。
-
Dale,我尝试在顶部切换 SET 和 SELECT。我在上面的原始问题中留下了一个注释,以显示我做了什么。不过,我可能会误解你在说什么。
-
我想我明白你现在的意思了。我最近刚刚更新了上面的代码,现在我得到了不同的消息输出。再次感谢您的意见!
-
我认为@ISBN 是插入的值我猜...
标签: sql-server tsql triggers sql-insert