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
Tu devras,
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
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.
Ensuite, ajoutez simplement ON DELETE CASCADE
à la commande ADD CONSTRAINT
:
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.
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.
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.
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.
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