2010-11-19 8 views
5

Avoir une table appelée personne. qui a personid et contactid.décision de conception pour DELETE SQL

Si une personne est supprimée, alors je souhaite retirer la personne de la base de données ainsi que des contacts connexes pour cette personne.

Est-il préférable d'effectuer la procédure DELETS dans ONE Store ou est-ce que ma couche de gestion doit d'abord appeler pContactDelete, puis appeler pPersonDelete ???????

grâce Niall

+0

Juste une suggestion, mais c'est le genre de chose qui pourrait nécessiter un 'UNDO' à un moment donné (c.-à-restaurer une personne à votre système). Avez-vous envisagé d'avoir un drapeau «actif» sur votre personne et de faire une suppression logique plutôt que physique? – Paddy

Répondre

12

En supposant que vous utilisez MS SQL Server:

Vous devriez probablement utiliser ON DELETE CASCADE sur votre clé étrangère.

ALTER TABLE Contact 
ADD CONSTRAINT FK_PersonContact FOREIGN KEY (PersonId) 
REFERENCES Person(PersonId) ON DELETE CASCADE 

Ceci s'assurera qu'une ligne de contact est supprimée lorsque la ligne de personne est supprimée. C'est une contrainte qui est toujours appliquée par la base de données.

Vous pouvez également définir cela dans SQL Management Studio dans la boîte de dialogue Relations de clé étrangère, section INSERT et UPDATE Specification, Delete Rule -> set to Cascade. Assurez-vous que si vous mettez en cache vos objets Contact dans votre couche de gestion, vous devez également actualiser votre cache.

1

vous pouvez définir un effet en cascade sur la référence clé

1

Toute approche que vous prenez, les données doivent être dans un état cohérent. Il serait plus simple si vous effectuez des opérations sur les deux tables dans la même procédure stockée. Si vous mettez dans votre entreprise, je pense que vous devriez utiliser la transaction, de sorte que si vos contacts ne sont pas supprimés, vous pouvez annuler la suppression de la personne.

1

Si vous utilisez Oracle, vous avez quelques options.

  1. Définissez la clé étrangère entre les tables PERSON et CONTACT pour supprimer les suppressions en cascade.

  2. Créez un déclencheur ON DELETE et effectuez les suppressions à cet endroit. Cette option vous donne également la possibilité de créer toutes les entrées de piste d'audit nécessaires ou d'écrire dans les fichiers journaux, etc., ce qui peut être nécessaire lorsque quelque chose est supprimé.

Partagez et appréciez.

+0

+1 non limité à Oracle, car divers SGBDR prennent en charge ON SUPPRIMER CASCADE pour les clés étrangères et les déclencheurs ON DELETE – fredt

0

Mon approche de ce problème consiste à NE PAS utiliser la contrainte de suppression en cascade comme principe général. Les suppressions en cascade peuvent avoir des effets bizarres lorsqu'il existe des références cycliques. Dans un environnement de production, il est conseillé de gérer la suppression des références enfants via la procédure stockée. Il n'est pas nécessaire de passer cet appel à partir de la couche Business tant que vous n'effectuez aucune validation significative avant de supprimer les contacts.

+0

J'ai une si mauvaise imagination que je ne vois pas de situation où il pourrait y avoir des références cycliques de clés étrangères avec des suppressions en cascade. Je pense que Supprimer <-> Set Null (ou Set Default) est plus commun. –

+0

Salut Arto, Pour aider votre imagination à assumer la table principale "SalesMan" et la table des enfants en tant que "Commande". La table de commande contient "PrimarySalesManId" et "SecondarySalesManId". Maintenant, si vous voulez supprimer un enregistrement de la table maître et avec une suppression en cascade, comment vous attendez-vous à ce que la suppression fonctionne? Aide-t-il? – Hunter