2015-05-09 77 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; 
相關問題