2009-08-23 6 views
0

Je me demandais comment j'allais créer un déclencheur pour mettre à jour la table d'expédition une fois qu'une nouvelle vente a été insérée dans la table des ventes. Je devine que les premières lignes du code ressemblera à ceci:déclencheur lorsqu'une vente est faite pour mettre à jour la table d'expédition

create trigger sale_trig 
after insert of sale_id on sales 
..... 

Mais je ne suis pas sûr de savoir comment faire le reste. J'utilise iSQL Plus.

Le tableau des ventes se compose de: sale_id, sale_price, sale_date, no_of_prods, prod_id, cust_id, desp_id. La table d'expédition est constituée de: desp_id, shelfLoc, quantity, prod_id, prod_name.

Je suppose que je n'ai pas sale_id dans la table d'expédition, je devrais ajouter cela en premier et en faire une clé étrangère, mais je ne suis pas sûr.

EDIT

Je crée des données de test pour une base de données. Le schéma qu'ils nous ont dit dit que nous devons inclure prod_name dans la table d'expédition pour une raison quelconque, mais je pensais que nous aurions seulement besoin de le lier avec prod_id.

Peut-être que ce n'est pas une mise à jour. Serait-ce juste un nouvel insert dans la table d'expédition? Je l'utilise pour iSQL Plus. Pour shelfLoc, on nous a dit de générer des chaînes aléatoires, en utilisant le générateur aléatoire. Alors, comment pourrais-je relier cela dans le déclencheur? (J'espère que cela a du sens)

+0

Vous pourriez envisager d'indiquer aux utilisateurs quel SGBD vous utilisez, car les déclencheurs varient considérablement. MS SQL Server, Oracle, MySQL, Postgres, ...? –

+1

Pourquoi ne le faites-vous pas simplement dans l'application elle-même? Pourquoi ajouter un déclencheur? Il y a le code d'application qui a complété la vente et peut facilement ajouter la rangée à expédier aussi. Pourquoi utiliser un déclencheur? Pourquoi ne pas mettre à jour l'application? –

+0

Parce que c'est une exigence que je dois utiliser un déclencheur pour mettre à jour la table d'expédition une fois qu'une vente a été faite. – taksIV

Répondre

1

Je ne sais pas pourquoi votre table DESPATCH a la colonne PROD NAME - qui devrait être dérivable par une recherche de clé étrangère sur PRODUCT via PROD ID. Il a certainement besoin d'un lien vers les ventes, sinon comment le répartiteur sera capable de trouver l'adresse pour l'envoyer aussi. Je pense aussi qu'il a besoin d'une colonne DATE_DISPATCHED, qui ne sera remplie qu'après l'envoi de la commande.

Vous ne parlez pas de la base de données que vous utilisez. Je vais utiliser Oracle parce que c'est celui que je connais le mieux.

create or replace trigger sale_trig 
    after insert on sales for each row 
begin 
    insert into despatch 
     (desp_id 
     , shelfLoc 
     , quantity 
     , prod_id 
     , prod_name 
     , sales_id) 
    values 
     (despatch_sequence.nextval 
     , dbms_random.string('U', 5) 
     , :new.no_of_prods 
     , :new.prod_id 
     , :new.prod_name 
     , :new.sales_id); 
end; 
/

Notez que j'ai dû faire quelques hypothèses au sujet de votre modèle de données parce que vous n'avez pas fourni suffisamment d'informations:

  1. desp_id est remplie avec une séquence
  2. shelfloc est peuplée par quelque type de cartes recherche
  3. sales.no_of_prods à despatch.quantity

Modifier: tout en republiant votre question le tag de mise à jour m'a fait relire votre question. Vous dites que vous voulez mettre à jour la table DESPATCH, mais je ne comprends pas pourquoi. Pourquoi auriez-vous un enregistrement DESPATCH avant qu'une commande ne soit passée? Alors, qu'est-ce qu'il y a à mettre à jour?

Édition 2: J'ai modifié le code de déclenchement pour refléter votre réponse.

Questions connexes