2015-02-23 143 views
0

我有一个小问题,现在一直困扰着我的SQL,比方说我有两个表(CustomerLoan)。不过,我想要一个基于Borrowertype属性进行检查的触发器。我想在第二个查询之后,我需要检查Loans中的userID是否与Customer中的userID相同,但是必须将其搞乱,否则我完全错误地认为这是错误的。SQL Server 2012触发器

CREATE TABLE Customer 
(
    userID int identity primary key, 
    Name varchar(20), 
    Borrowertype varchar(20) 
); 

CREATE TABLE Loan 
(
    Id int identity primary key, 
    userID int, 
    FOREIGN KEY (userID) REFERENCES Customer(userID) 
); 

IF OBJECT_ID ('Customer.maximum_books_per_user','TR') IS NOT NULL 
    DROP TRIGGER Customer.maximum_books_per_user; 
GO 

CREATE TRIGGER maximum_books_per_user ON Customer 
AFTER INSERT 
AS 
IF (SELECT Borrowertype FROM Customer) = 'diffborrowertypehere' 
    AND (SELECT COUNT(*) FROM inserted AS i JOIN Customer AS c 
     ON ??? WHERE ??? 
     ) > 5 
BEGIN 
    ROLLBACK TRANSACTION 
    RAISERROR('You have reached maximum allowed loans.', 16, 1) 
END 
GO 
+0

插入的只包含插入与此一个交易行处理多个客户插入。你应该只检查一下还是对早期的贷款呢?也许检查约束+一个函数会更容易弄清楚。 – 2015-02-23 19:48:22

+0

您的'SELECT BorrowerType FROM Customer'将返回来自Customer的所有行,因此您无法使用简单的'=',因为这没有意义。你能否解释你对触发器的要求,因为从目前为止发布的内容不清楚吗? – TobyLL 2015-02-23 19:48:54

+0

@TobbyLL嗯...我想检查贷款中可以有的最大行数。所以如果一个人超过5个,那么它就不会被插入到贷款中。 – zxcvsadfqwerty 2015-02-23 19:52:29

回答

2

您的触发器需要放在Loan表中,因为这是插入的行可能被拒绝的地方。事情是这样的:

编辑:重写一次

CREATE TRIGGER maximum_books_per_user ON Loan 
FOR INSERT 
AS 
-- Fail if there are any customers that will have more than the maximum number of loans 
IF EXISTS (
    SELECT i.userID, COUNT(*) 
    FROM inserted i 
    JOIN Loan l 
     ON i.userID = l.userID 
    GROUP BY i.userID 
    HAVING COUNT(*) >= 5 
) 
BEGIN 
    ROLLBACK TRANSACTION 
    RAISERROR('You have reached maximum allowed loans.', 16, 1) 
END 
+0

啊,是的,我想这是有道理的! – zxcvsadfqwerty 2015-02-23 20:04:24

+0

为多个客户的插入重写触发器 – TobyLL 2015-02-23 20:12:11