Je suis si près d'obtenir la réponse à cela, mais j'ai l'impression de manquer la dernière partie.

J'ai créé un déclencheur DELETE qui doit afficher les valeurs de l'instruction SELECT avant qu'elles ne soient supprimées du tableau. Cependant, lorsque le déclencheur est appelé, j'obtiens un résultat vide, mais les valeurs (order_id = 10001 AND product_id = 25) sont toujours supprimées de la table.

J'ai vérifié que l'instruction SELECT fonctionne avant d'exécuter le déclencheur, donc je suis convaincu que cette partie est correcte.

J'ai essayé d'utiliser un déclencheur INSTEAD OF DELETE, mais les valeurs finissent par ne pas être supprimées. Je ne pense pas qu'il existe une fonction BEFORE DELETE pour SQL Server? Y at-il un travail autour?

Suggestions?

CREATE TRIGGER deleteOrderTrigger
ON order_details
FOR DELETE
AS
    SELECT order_details.product_id, products.name, 
           order_details.quantity AS 'Quantity being deleted from order', 
           SUM(products.quantity_in_stock) + order_details.quantity AS 'In Stock Quantity after Deletion'
    FROM order_details
    LEFT JOIN products ON products.product_id = order_details.product_id
    WHERE order_details.order_id = 10001 AND products.product_id = 25
    GROUP BY order_details.product_id, products.name, order_details.quantity

GO

-- Below is the code that will fire the trigger
DELETE order_details
WHERE order_id = 10001 AND product_id = 25
0
Chef1075 24 nov. 2017 à 20:12

3 réponses

Meilleure réponse

@JoeC - l'utilisation d'un proc est probablement la meilleure réponse.

Si vous devez utiliser un déclencheur, rappelez-vous qu'il doit être codé pour prendre en charge les ensembles. Si quelqu'un exécute delete order_details where order_id = 10001, votre déclencheur devra renvoyer le niveau de stock pour chaque produit de la commande.

De plus, lors du codage d'un déclencheur, vous avez accès à une table intégrée nommée supprimée. Cette table contient les enregistrements supprimés.

Vous pouvez donc faire quelque chose comme ceci:

CREATE TRIGGER deleteOrderTrigger
ON order_details
FOR DELETE
AS

INSERT INTO deleted_order_products_log

SELECT order_details.product_id
      ,products.name
      ,[Quantity being deleted from order] = order_details.quantity
      ,[In Stock Quantity after Deletion] = SUM(products.quantity_in_stock) + order_details.quantity
  FROM order_details
    INNER JOIN deleted d
        ON order_details.primaryKey = d.primaryKey
      LEFT JOIN products
          ON products.product_id = order_details.product_id
 GROUP BY order_details.product_id
         ,products.name
         ,order_details.quantity;

Vous pouvez ensuite interroger le fichier journal pour obtenir les résultats du calcul.

1
John 24 nov. 2017 à 17:45

Placez les résultats du déclencheur dans une table d'audit et vous verrez les résultats du déclencheur. Je n'ai jamais vu de déclencheur avec une clause where similaire à la vôtre. Faites une insertion dans la table x sélectionnez .... Vous souhaitez également utiliser la table supprimée (il y a une table insérée) qui est créée uniquement pour chaque occurrence du déclencheur qui contiendra une / toutes les lignes qui viennent d'être supprimées. La suppression se produit dans le corps principal du code. Le déclencheur est alors invoqué et la table supprimée (vous pouvez faire une suppression * de supprimée uniquement dans le déclencheur) qui contiendra la ou les lignes supprimées.

0
benjamin moskovits 24 nov. 2017 à 17:43

Je n'ai pas beaucoup utilisé les déclencheurs, mais il semble que vous ayez un déclencheur AFTER, qui ne peut pas lire les lignes supprimées, c'est pourquoi vous obtenez un résultat vide.

Le truc avec les déclencheurs sont les tables insérées et supprimées, peut-être que cela aiderait: https://docs.microsoft.com/en-us/sql/relational-databases/triggers/use-the-inserted-and-deleted-tables

Vous avez besoin d'un déclencheur INSTEAD OF comme vous l'avez mentionné, mais vous devez effectuer vous-même l'opération de suppression. Plus d'informations sur ce sujet ici: https: // docs. microsoft.com/en-us/sql/relational-databases/triggers/dml-triggers et un exemple ici: https : //stackoverflow.com/a/3267726/5605866

0
Gigga 24 nov. 2017 à 17:38
47477651