2012-08-08 97 views
2

我正在嘗試創建一個相當簡單的觸發器,它將一列添加到跟蹤類似於Netflix的電影發行公司的租借數量的列中。SQL Server觸發器:多部分標識符無法綁定

我關注的列是:

  • 電影movie_id, movie_title, release_year, num_rentals
  • Customer_rentalsitem_rental_id, movie_id, rental_date_out, rental_date_returned

我當前觸發看起來是這樣的:

CREATE TRIGGER tr_num_rented_insert 
ON customer_rentals FOR INSERT 
AS 
BEGIN 
UPDATE movies 
SET num_rentals=num_rentals+1 
WHERE customer_rentals.movie_id=movies.movie_id; 
END; 

它會返回錯誤:

Msg 4104, Level 16, State 1, Procedure tr_num_rented_insert, Line 7
The multi-part identifier "customer_rentals.movie_id" could not be bound.

我只是希望它匹配movie_id的,並添加1〜出租數量。

回答

6

你需要加入到inserted僞表:

CREATE TRIGGER dbo.tr_num_rented_insert 
ON dbo.customer_rentals 
FOR INSERT 
AS 
BEGIN 
    UPDATE m 
    SET num_rentals = num_rentals + 1 
    FROM dbo.movies AS m 
    INNER JOIN inserted AS i 
    ON m.movie_id = i.movie_id; 
END 
GO 

但我要問,什麼是保持這個計數最新的電影表的意義呢?你可以隨時看到查詢計數,而不是將其存儲冗餘的:

SELECT m.movie_id, COALESCE(COUNT(r.movie_id)) 
    FROM dbo.moves AS m 
    LEFT OUTER JOIN dbo.customer_rentals AS r 
    ON m.movie_id = r.movie_id 
    GROUP BY m.movie_id; 

如果該查詢的性能就成了一個問題,您可以創建一個索引視圖來維持數量,使得你不必保持最新的一個觸發:

CREATE VIEW dbo.rental_counts 
WITH SCHEMABINDING 
AS 
    SELECT movie_id, num_rentals = COUNT_BIG(*) 
    FROM dbo.customer_rentals 
    GROUP BY movie_id; 

這將導致維修爲您的觸發相同那種,但是它沒有你的觸發器,並執行它,而不會影響movies表。我們得到的租金計數你可以說:

SELECT m.movie_id, m.other_columns, 
    num_rentals = COALESCE(r.num_rentals, 0) 
    FROM dbo.movies AS m 
    LEFT OUTER JOIN dbo.rental_counts AS r 
    ON m.movie_id = r.movie_id; 

(我們使用一個離開,因爲一部電影可能還沒有被租在這裏加入。)

這裏有一個額外的好處是,你不必須執行任何技巧才能將電影表中的其他列轉換爲結果。它還可以確保數據的準確性,即使租賃被刪除(您的觸發器將繼續愉快地爲計數添加+1)。

+0

這是一個任務,我試圖通過 - 參數是一個新插入的列(num_rentals),它必須增加每個租賃...我同意可以有更簡單的方法來做到這一點。感謝您的幫助。修正它吧! – 2012-08-08 19:17:24

-1

您的代碼對於簡單的插入觸發器是正確的。假設這兩列確實存在於這兩個表中,那麼您的問題可能是您在WHERE語句末尾添加了分號。分號只能在END語句之後。

相關問題