2014-12-06 53 views
1

我對編程非常陌生。我正在嘗試自學SQL。我製作了一個帶有客戶,租賃和庫存表的視頻商店數據庫。我正在查看示例以嘗試學習SQL,因此請善待。我希望這個觸發器能夠阻止一個人同時租用同一部電影。我一直在閱讀觸發器,並希望對下面的代碼有所幫助。SQL TRIGGER多部分標識符受限制

我收到最後一個END語法錯誤,RAISEERROR和INSERTED語法錯誤。我仍然在i.Rental.rentNum插入的i上收到消息「Trigger multipart identifier can not be bound」。

任何幫助將不勝感激!

CREATE TRIGGER 
insteadOFInsert ON Rental 
INSTEAD OF INSERT 
AS 
DECLARE @rentNum int, @action varchar(60) 

SELECT @Rent_rentNum=i.Rental.rentNum inserted i; 
SET @action='stop rental trigger.' 
    @Rent_rentNum=(SELECT rentNum FROM inserted; 

BEGIN 
    BEGIN TRAN 
    SET NOCOUNT ON 
     IF (@RENT_rentNum=Rental.rentNum) 
     BEGIN 
      RAISEERROR ('You cannot rent the same move twice'); 
      ROLLBACK 
     END 
     ELSE 
     BEGIN 
      INSERT INTO 
      Rental(rentNum) 
        VALUES 
       (@rentNum) 
      INSERT INTO 
       Rent values (rentNum); 
      COMMIT 
      PRINT 'Updated' 
     END 
     END 
+0

如果你看到,你的格式化的代碼,它不完整,一端缺失? – HaveNoDisplayName 2014-12-06 01:07:37

+0

'INSERT INTO 租金(rentNum)...'這是不完整的 – Mihai 2014-12-06 01:07:54

+0

並且您的插入聲明incomelete與表 – HaveNoDisplayName 2014-12-06 01:10:34

回答

0

,您的觸發有幾個根本缺陷:

  • 永遠使用BEGIN TRAN觸發器內!觸發器是導致它開火語句的上下文中運行,因此是已經在交易

  • 你需要知道的是,觸發將被稱爲每條語句一次的情況下 - 不是每行一次!所以,如果你INSERT語句插入10行,你激活觸發器一次Inserted僞表將包含10行數據 - 你認爲哪個人會在你的聲明

    SELECT rentNum FROM inserted; 
    

    一個採摘他們會做 - 多或少隨機 - 而其他9人將被忽略。

因此,基本上,你需要在你的觸發完全改寫爲這樣的:

CREATE TRIGGER insteadOFInsert 
ON dbo.Rental 
AFTER INSERT 
AS 
    // if any one of the rows inserted already exists in the Rental table -> abort 
    IF EXISTS (SELECT * FROM dbo.Rental WHERE RentNum IN (SELECT RentNum FROM Inserted)) 
    BEGIN   
     RAISEERROR ('You cannot rent the same move twice'); 
     ROLLBACK 
    END 

你沒有解釋爲什麼你有所回升使用一個INSTEAD OF INSERT觸發器 - 我真的沒有看到任何好的理由,所以我選擇做爲AFTER INSERT觸發器來代替(這只是簡單的寫這些)

+1

謝謝。你的建議很簡單有效。我仍然在學習SQL,所以我有很多事情要做。再次感謝你,先生! – EmilyJohnson 2014-12-08 02:25:30

0

您從第二個插入語句中缺少values。試試這個

INSERT INTO Rent values (@rentNum); 

[編輯]

DECLARE @Rent_rentNum int 
    SET @Rent_rentNum = (SELECT rentNum FROM inserted); 

,也符合 「插入」 之前每個打開和關閉BEGIN & END

+0

你的當前觸發器是否正確編譯?,如果不是那麼嘗試在末尾添加「END」 – HaveNoDisplayName 2014-12-06 01:26:46

+0

我得到語法錯誤最後END,RAISEERROR和INSERTED語法錯誤,我仍然在i.Rental.rentNum插入的i; – EmilyJohnson 2014-12-06 01:41:49

+0

上使用更新的行,您在觸發器中設置變量值時仍然收到消息「Trigger multipart identifier can not be bound」 – HaveNoDisplayName 2014-12-06 01:46:12

0

您的第一個SELECT缺少FROM。

+0

是的,我錯過了之前插入(這是一個錯字 - 我的代碼是在一個虛擬機,我不能複製並從我的Mac粘貼)。我仍然真的很掙扎與「觸發器多部分標識符不能綁定」i.Rental.rentNum插入i; – EmilyJohnson 2014-12-06 03:15:06

相關問題