7
votes

SQL Server Mettre à jour la mise à jour: comment le faire fonctionner

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.

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: xxx

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!


2 commentaires

Vous pouvez faire SET NUM_RENTALS = NUM_RENTALs + 1 dans la mise à jour de la gâchette et SET NUM_RENTALS = NUM_RENTALs - 1 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?


3 Réponses :


-1
votes

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 xxx


2 commentaires

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.



1
votes

Je crois que vous pouvez accomplir cela en ajoutant m.num_rentaltals + 1

Ajoutez également dans une instruction de mise à jour pour supprimer une xxx

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
xxx


1 commentaires

Merci Christoire. Je dois le faire via une gâchette car il s'agit d'une affectation sur les déclencheurs.



10
votes

Vous devez prendre en compte qu'une instruction DML peut affecter plusieurs lignes (auquel cas les osseuses code> insérées code> et supprimé des tables code> auront également plusieurs rangées.

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>

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; 


0 commentaires