在SQL中触发对列进行计数,并在超过特定值时给出错误

在SQL中触发对列进行计数,并在超过特定值时给出错误,sql,sql-server,triggers,Sql,Sql Server,Triggers,我需要一个触发器来避免为列插入特定值,例如,在预订表中,我有一个bookingId和invoiceId。我想计算每张发票的BookingID,并将该数字与航空公司表中名为MaxBooking的数字进行比较。如果号码超过MaxBooking,则意味着我无法再使用该发票号码预订 |bookingId|invoiceId|passengerId|FlightId| |1 |101 |20 |99 | |1 |1

我需要一个触发器来避免为列插入特定值,例如,在预订表中,我有一个bookingId和invoiceId。我想计算每张发票的BookingID,并将该数字与航空公司表中名为MaxBooking的数字进行比较。如果号码超过MaxBooking,则意味着我无法再使用该发票号码预订

|bookingId|invoiceId|passengerId|FlightId|
|1        |101      |20         |99      |              
|1        |101      |20         |99      |            
|1        |101      |20         |99      |     
|1        |101      |20         |99      |


|FlightId |AirlineId|      
|99       |500      |


|AirlineId|AirlineName    |MaxBooking|
|500      |Biritish Airway|4         |

你应该更好地解释你的问题。你可能正在寻找下面这样的东西。这只是一个例子,不值得使用

if exists (select top 1 1 from booking b
                          join flight f on f.bookingid = b.bookingid 
                          join airline a on a.airlineid  = f.airline_id
                          join inserted i on i.bookingid = b.bookingid
                          where (select count(*) from booking bb where bb.bookingid = b.booking_id) > f.maxbooking
                               )
begin

 rollback tran

end 

然而,在预订桌上似乎没有好的钥匙,当您在5排和最多4排时,您应该怎么做。前4个是低谷吗?这将使查询更加复杂

这就是您正在搜索的精确解决方案

我假设表名为: 1.dbo.航班预订 2.dbo.Flights 3.dbo.航空公司 根据他们在你问题中的表现

CREATE TRIGGER [dbo].[trg_restrictMaxBooking] 
   ON  [dbo].[FlightBookings]
   INSTEAD OF INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    BEGIN TRANSACTION
        DECLARE @FlightId INT
        SELECT @FlightId=I.FlightId FROM inserted I

        IF((SELECT COUNT(*) FROM dbo.FlightBookings WHERE FlightId=@FlightId)<ISNULL((SELECT MaxBooking FROM dbo.Airlines WHERE AirlineId=(SELECT AirLineId FROM dbo.Flights WHERE FlightId=@FlightId)),0))
        BEGIN
            ROLLBACK TRANSACTION
            RAISERROR('Failed',16,1)
            RETURN
        END 
    COMMIT TRANSACTION
END
GO

如果您需要任何进一步的帮助或我遗漏了什么,请告诉我。

标签似乎不明确。。。这是MySQL还是SQL Server?你尝试过什么,但什么不起作用?这是在sql中,实际上我在sql中很重要,我对触发器没有足够的了解。当触发器检测到错误时,你总是希望按顺序执行以下操作:回滚、RAISERROR,然后返回。不建议将触发器编码为只处理一行,就像这里的代码一样。如果使用一个命令插入多行,那么您的代码将只验证一行。