2015-05-09 41 views
1

我需要制作一个触发器来检查客户是否可以插入表格之前是否需要飞机座椅。T-SQL触发器检查飞机座位是否被采用

我有以下触发至今:

CREATE TRIGGER CheckIfSeatIsUnique 
ON PassagierVoorVlucht 
AFTER insert, update 
AS 
BEGIN 
    IF @@ROWCOUNT = 0 RETURN 
    SET NOCOUNT ON 

    BEGIN TRY 

    IF EXISTS (SELECT 1 FROM PassagierVoorVlucht P Join inserted I on P.vluchtnummer=i.vluchtnummer Where P.stoel = I.stoel) 
    BEGIN 
     RAISERROR('The chosen seat is taken', 16, 1) 
     END 
    END TRY 
    BEGIN CATCH 
     IF @@TRANCOUNT > 0 
      ROLLBACK TRANSACTION 
     DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE() 
     DECLARE @ErrorSeverity INT = ERROR_SEVERITY() 
     DECLARE @ErrorState INT = ERROR_STATE() 
     RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState) 
    END CATCH 
END 

我的问题是,如果座位已插入AFTER触发器检查已完成,因此,座位总是会不管采取。

有没有办法在插入完成之前检查座位是否被占用?

编辑:它还必须能够在座位输入NULL,因为seatnumber不知道,直到几天飞行

+1

将创建'vluchtnummer唯一约束,stoel' –

+0

使用'而不是of'而不是'after'。 –

+0

我不能使用唯一的约束,因为列stoel也可以为null。 我也尝试创建一个而不是,但然后我得到错误'不能创建而不是更新触发器,这是因为表具有级联更新的外键' – FearReaper

回答

1

之前,如果你对表的唯一标识符,你可以加入成EXISTS()查询过滤掉试图插入的任何记录。

下面的示例这个小提琴,虽然它假定你正在照顾一个null处理,你需要在这之外。

http://sqlfiddle.com/#!6/93a8a

CREATE TRIGGER CheckIfUnique_mydata_value ON dbo.data 
AFTER insert, update 
AS 
BEGIN 
--check if we passed multiple values 
    IF EXISTS(SELECT 1 FROM inserted GROUP BY value HAVING COUNT(*) > 1) 
    BEGIN 
    RAISERROR('You tried to insert a duplicate value within the result set. Ensure you only pass unique values!', 16,1) 
    END 
    --check if we inserted a value that already exists that is not me (works for updates on me too!) 
    IF EXISTS(SELECT 1 FROM dbo.data m INNER JOIN inserted i ON m.value = i.value AND m.id <> i.id) 
    BEGIN 
    RAISERROR('Duplicate Value found',16,1) 
    END 
END;