Ste*_*eve 7 sql sql-server triggers
我正在尝试为我的"Blockbuster-like"电影公司编写一个sql server更新触发器.在我的MOVIES表中,我将movie_id作为PK,另一列名为num_rented,它总共保留了一部电影的租借次数.这个总数是通过我的插入,删除和更新触发器完成的.(我知道有更好的方法可以做到这一点,但我的任务特别要求这样做,所以请理解这一点).CUSTOMER_RENTALS表具有item_rental_id作为PK,MOVIES中的movie_id是FK.
我需要一个更新触发器,只要对CUSTOMER_RENTALS进行更新,它就会更新MOVIES中的num_rentals列.例如,假设movie_id 1已输入,但这是一个错误,它确实是movie_id 2.我希望num_rentals能够反映更新.
这是我到目前为止所做的,但我真的不知道在SET部分放置什么来实现这一目标:
CREATE TRIGGER tr_num_rentals_update
ON customer_rentals
AFTER UPDATE
AS
BEGIN
UPDATE m
SET num_rentals = ??????
FROM movies AS m
INNER JOIN inserted as i on m.movie_id=i.movie_id;
END;
Run Code Online (Sandbox Code Playgroud)
我想某种方式我需要访问已删除的表的值,以将num_rental列恢复到以前的值,但我不知道如何.提前感谢十亿!
Mar*_*ith 10
您需要考虑DML语句可能会影响多行(在这种情况下,INSERTED和DELETED表也将有多行).
如果电影更新为不同的ID(以及增加新电影的计数),您还需要考虑减少电影的租借次数.
下面合并插入和删除的计数,并将净更改应用于相关的movieid.
CREATE TRIGGER tr_num_rentals_update
ON customer_rentals
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
IF UPDATE(movie_id) /*If column not affected skip*/
BEGIN
WITH T1(Cnt, movie_id)
AS (SELECT COUNT(*),
movie_id
FROM inserted
GROUP BY movie_id
UNION ALL
SELECT -COUNT(*), /*negative for deletes*/
movie_id
FROM deleted
GROUP BY movie_id),
T2
AS (SELECT SUM(Cnt) AS NetCnt,
movie_id
FROM T1
GROUP BY movie_id)
UPDATE m
SET num_rentals = num_rentals + NetCnt
FROM movies AS m
INNER JOIN T2
ON m.movie_id = T2.movie_id;
END
END;
Run Code Online (Sandbox Code Playgroud)
Ank*_*ain -1
您需要在更新后执行触发器。您可以尝试以下操作。为了更好地理解触发器,我强烈推荐此链接 http://www.codeproject.com/Articles/25600/Triggers-Sql-Server
CREATE TRIGGER trgAfterUpdate ON [dbo].[customer_rentals]
FOR UPDATE
AS
declare @num_rentals int;
declare @movie_id int;
SELECT @movie_id =i.movie_id from inserted i;
SELECT @num_rentals =num_rentals from MOVIES where movie_id =@movie_id
SET @num_rentals =@num_rentals +1;
-- perform update here in movies table
UPDATE MOVIES SET num_rentals=@num_rentals WHERE movie_id =@movie_id
GO
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
60178 次 |
| 最近记录: |