web-dev-qa-db-fra.com

Comment utiliser la suppression en cascade avec SQL Server?

J'ai 2 tables: T1 et T2, ce sont des tables existantes avec des données. Nous avons une relation un à plusieurs entre T1 et T2. Comment modifier les définitions de table pour effectuer une suppression en cascade dans SQL Server lorsqu'un enregistrement de T1 est supprimé, tous les enregistrements associés dans T2 sont également supprimés.

La contrainte étrangère est en place entre eux. Je ne veux pas supprimer les tables ou créer un déclencheur pour effectuer la suppression pour T2. Par exemple, lorsque je supprime un employé, tout l'enregistrement de révision devrait également disparaître.

T1 - employé,

Employee ID      
Name
Status

T2 - Évaluations du rendement,

Employee ID - 2009 Review
Employee ID - 2010 Review
293
Bichvan Nguyen

Tu devras,

  • Supprimer la contrainte de clé étrangère existante,
  • Ajoutez-en un nouveau avec le paramètre ON DELETE CASCADE activé.

Quelque chose comme:

ALTER TABLE dbo.T2
   DROP CONSTRAINT FK_T1_T2   -- or whatever it's called

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE
333
marc_s

Pour ajouter "Suppression en cascade" à une clé étrangère existante dans SQL Server Management Studio:

Commencez par sélectionner votre clé étrangère et ouvrez-la sous "DROP and Create To .." dans une nouvelle fenêtre de requête.

enter image description here

Ensuite, ajoutez simplement ON DELETE CASCADE à la commande ADD CONSTRAINT:

n Et cliquez sur le bouton "Exécuter" pour exécuter cette requête.

En passant, pour obtenir une liste de vos clés étrangères et voir celles pour lesquelles la "suppression en cascade" est activée, vous pouvez exécuter ce script:

SELECT 
   OBJECT_NAME(f.parent_object_id) AS 'Table name',
   COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name',
   delete_referential_action_desc AS 'On Delete'
FROM sys.foreign_keys AS f,
     sys.foreign_key_columns AS fc,
     sys.tables t 
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1

Et si vous constatez que vous ne pouvez pas DROP une table particulière en raison d'une contrainte de clé étrangère, mais que vous ne pouvez pas déterminer le FK à l'origine du problème, vous pouvez exécuter cette commande:

sp_help 'TableName'

Le code SQL de cet article répertorie tous les FK qui font référence à une table particulière.

J'espère que tout ça aide.

Toutes mes excuses pour le doigt long. J'essayais juste de faire valoir un point.

264
Mike Gledhill

Vous pouvez le faire avec SQL Server Management Studio.

→ Cliquez avec le bouton droit de la souris sur la structure du tableau, allez à Relations et choisissez la clé étrangère dans le volet de gauche et dans le volet de droite, développez le menu "Spécification INSERT et UPDATE" et sélectionnez "Cascade" comme règle de suppression.

SQL Server Management Studio

152
Palanikumar

Utilisez quelque chose comme

ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;

Remplissez les noms de colonne corrects et vous devriez être défini. Comme mark_s l'a indiqué correctement, si vous avez déjà une contrainte de clé étrangère en place, vous devrez peut-être d'abord supprimer l'ancienne, puis créer le nouveau.

43
Hyperboreus

ON DELETE CASCADE
Il spécifie que les données enfants sont supprimées lorsque les données parent sont supprimées.

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);

Pour cette clé étrangère, nous avons spécifié la clause ON DELETE CASCADE qui indique à SQL Server de supprimer les enregistrements correspondants de la table enfant lorsque les données de la table parent sont supprimées. Ainsi, dans cet exemple, si une valeur product_id est supprimée de la table products, les enregistrements correspondants de la table Inventory qui utilisent ce product_id seront également supprimés.

14
Md Shahriar

Premier à activer la propriété ONCascade:

1.Drop la contrainte de clé étrangère existante

2.ajouter un nouveau avec le paramètre ON DELETE CASCADE activé

Ex:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 

ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

deuxième pour désactiver la propriété ONCascade:

1.Drop la contrainte de clé étrangère existante

2.Ajouter un nouveau avec le paramètre ON DELETE NO ACTION activé

Ex:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE NO ACTION 
END
14
ravula sandeep