2017-09-08 1 views
0

J'essaie d'apprendre le SQL, et même si mon parcours a été assez fructueux jusqu'à présent, j'ai rencontré des problèmes avec les déclencheurs. Pour l'anecdote, j'utilise SQL Server 2016. J'apprécierais toute aide que je pourrais obtenir. S'il vous plaît laissez-moi savoir si plus de détails sont nécessaires.Ajouter une ligne à la table ORDERS qui augmente alors le nombre ordonné de ce produit et le client?

+0

Avez-vous essayé de supprimer la cascade? –

+1

Cela semble être une très mauvaise idée. La suppression de la commande entraînerait la suppression de la transaction de votre système pour une transaction qui s'est produite. Pas une bonne idée. –

+0

Question générale. Pourquoi voudriez-vous supprimer le client? Était-ce une erreur d'entrée? Peut-être que les clients ne peuvent être supprimés que lorsqu'aucune commande n'est liée à ce client ... cela pourrait être une règle proposée. Vous pouvez passer à une autre étape et marquer les clients existants avec des commandes comme IsDeleted = true. –

Répondre

-1

espère que cela aidera

------------- 
--cascade delete way 
------------- 

CREATE TABLE dbo.customers (
     customer_id INT NOT NULL 
    , somedata UNIQUEIDENTIFIER NOT NULL 
    , CONSTRAINT PK_Customer PRIMARY KEY (customer_id) 
    ); 

CREATE TABLE dbo.orders (
     OrderID  INT NOT NULL 
    , customer_id INT NOT NULL 
    , somedata UNIQUEIDENTIFIER NOT NULL 
    , CONSTRAINT PK_Order PRIMARY KEY (OrderID) 
    , CONSTRAINT FK_CustomerOrder FOREIGN KEY (customer_id) 
REFERENCES dbo.customers (customer_id) ON DELETE CASCADE 
    ); 

INSERT INTO dbo.customers (customer_id,somedata) 
VALUES (1,NEWID()),(2,NEWID()) 

INSERT INTO dbo.orders(OrderID,customer_id,somedata) 
VALUES (1,1,NEWID()),(2,2,NEWID()) 

DELETE FROM dbo.customers WHERE customer_id = 1 

SELECT * FROM dbo.orders 

------------- 
--trigger way 
------------- 

CREATE TABLE dbo.customers1 (
     customer_id INT NOT NULL 
    , somedata UNIQUEIDENTIFIER NOT NULL 
    , CONSTRAINT PK_Customer1 PRIMARY KEY (customer_id) 
    ); 

CREATE TABLE dbo.orders1 (
     OrderID  INT NOT NULL 
    , customer_id INT NOT NULL 
    , somedata UNIQUEIDENTIFIER NOT NULL 
    , CONSTRAINT PK_Order1 PRIMARY KEY (OrderID) 
    , CONSTRAINT FK_CustomerOrder1 FOREIGN KEY (customer_id) 
REFERENCES dbo.customers1 (customer_id) ON DELETE CASCADE 
    ); 

GO 

CREATE TRIGGER DELTRIG 
ON dbo.customers1 
FOR DELETE 
AS 
    DELETE C 
    FROM dbo.orders1 AS C 
     INNER JOIN DELETED ON 
      C.customer_id = DELETED.customer_id 

GO 

INSERT INTO dbo.customers1 (customer_id,somedata) 
VALUES (1,NEWID()),(2,NEWID()) 

INSERT INTO dbo.orders1(OrderID,customer_id,somedata) 
VALUES (1,1,NEWID()),(2,2,NEWID()) 


DELETE FROM dbo.customers1 WHERE customer_id = 1 

SELECT * FROM dbo.orders1 
-1

Il est beaucoup plus sûr si vous ajoutez simplement un indicateur supprimé dans votre table client et dans votre déclencheur juste mettre à jour la colonne supprimée à true.

Mais si vous avez vraiment besoin de supprimer les enregistrements enfants après la suppression de l'enregistrement parent, essayez d'utiliser la suppression en cascade. Vous pouvez vous référer à cet ancien post. How do I use cascade delete with SQL Server?