J'essaie d'écrire un déclencheur de mise à jour SQL Server pour ma société de cinéma "Blockbuster-like". Dans ma table des films, j'ai un film_id comme la PK et une autre colonne appelée num_rentée qui conserve autant de fois qu'un film est loué. Ce total est effectué via mes déclencheurs d'insertion, de suppression et de mise à jour. (Je crois comprendre qu'il y a beaucoup de meilleures façons de le faire, mais ma mission appelle spécifiquement cela, alors veuillez comprendre ce point). La table Customer_Rentaltals a item_Rental_ID en tant que PK et Movie_ID à partir de films est un FK.
J'ai besoin d'un déclencheur de mise à jour qui mettra à jour la colonne Num_rentals dans des films chaque fois qu'une mise à jour est faite sur Customer_Rentaltals. Par exemple, disons que Movie_Id 1 était entrée mais c'était une erreur et c'était vraiment film_id 2. Je voudrais que les num_rentals reflètent la mise à jour. P>
Voici ce que j'ai jusqu'à présent, mais je ne sais vraiment pas quoi mettre dans la partie définie pour que cela se produise: p> je suis Penser en quelque sorte que j'ai besoin d'accéder aux valeurs de la table supprimées pour restaurer la colonne NUM_RENTE à sa valeur précédente, mais je ne sais pas comment. Merci un milliard d'avance! p> p>
3 Réponses :
Vous devez effectuer une fois la mise à jour de la mise à jour. Vous pouvez essayer ce qui suit. Pour une meilleure compréhension de la gâchette, je recommande fortement ce lien
http://www.codeproject.com/articles/25600/triggers-sql-server
Je vais sûrement regarder le lien fourni, merci. Je suis totalement inconnu avec la commande déclarative. Nous n'avons pas encore rencontré celui-ci pendant notre classe.
Ce n'est pas la bonne approche. Les déclencheurs doivent faire face aux mises à jour de plusieurs lignes.
Je crois que vous pouvez accomplir cela en ajoutant m.num_rentaltals + 1
Ajoutez également dans une instruction de mise à jour pour supprimer une p> Cependant au lieu de l'avoir dans Déclencheurs, je préférerais créer une vue L'application peut utiliser pour le ramasser. Retrait ainsi la manipulation de données supplémentaire nécessaire à effectuer avec chaque mise à jour, insérer et supprime
p>
Merci Christoire. Je dois le faire via une gâchette car il s'agit d'une affectation sur les déclencheurs.
Vous devez prendre en compte qu'une instruction DML peut affecter plusieurs lignes (auquel cas les osseuses code> insérées code> et Vous aussi. doivent prendre en compte que vous devriez décrémenter le nombre de locations d'un film s'il est mis à jour à un identifiant différent (ainsi que d'incrémenter le nombre de comptes pour le nouveau film). P> La ci-dessous consolide les comptes de L'insertion et supprime et applique les modifications nettes des filmids pertinents. P> supprimé des tables code> auront également plusieurs rangées.
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;
Vous pouvez faire
SET NUM_RENTALS = NUM_RENTALs + 1 code> dans la mise à jour de la gâchette et
SET NUM_RENTALS = NUM_RENTALs - 1 CODE> EN DELETE TRYGER
C'est exactement ce que j'ai fait dans ma supprimer la gâchette RS et mon déclencheur d'insertion est configuré avec NUM_RENTALs = NUM_RENTALs + 1. Avec un déclencheur de mise à jour, je n'ai besoin que de la double capacité pour ajouter à la colonne NUM_RENTALs correcte et soustraire de l'incorrect Colonne Num_rentals?