繁体   English   中英

SQL Server触发器:不能绑定多部分标识符

[英]SQL Server trigger: multi-part identifier could not be bound

我正在尝试创建一个相当简单的触发器,该触发器将添加到一列中,以跟踪类似Netflix的电影发行公司的出租数量。

我关注的列是:

  • 电影movie_id, movie_title, release_year, num_rentals
  • 客户 item_rental_id, movie_id, rental_date_out, rental_date_returneditem_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;

它返回错误:

消息4104,级别16,状态1,过程tr_num_rented_insert,第7行
不能绑定多部分标识符“ customer_rentals.movi​​e_id”。

我只希望它与movie_id匹配,并在租借数量上加1。

您需要加入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;

(我们在这里使用LEFT JOIN,因为可能尚未租借电影。)

这里的另一个好处是,您无需执行任何技巧即可将movies表中的其他列添加到结果中。 即使删除了租借,它也可以确保数据准确无误(您的触发器将继续愉快地为计数增加+1)。

您的代码对于简单的插入触发器是正确的。 假设两个表中都确实存在这些列,那么您的问题可能是您在WHERE语句的末尾放置了分号。 分号只能在END语句之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM