Conflictuel CASCADE et RESTRICT exigences clés étrangères?

voix
2

Je travaille sur une base de données qui permet de suivre les fichiers et les dépendances dans les projets. En bref, j'ai deux tableaux principaux; les listes de table PROJETS noms et projettent d'autres propriétés, la table FILES répertorie les fichiers. Tous les points d'entrée de fichier à un projet en tant que clé étrangère mis à CASCADE, donc si je supprimer un enregistrement de projet à partir de la base de données, tous les enregistrements de fichiers disparaissent ainsi. Jusqu'ici tout va bien.

Maintenant, j'ai une table DEPENDENCIES supplémentaire. Chaque enregistrement de la table de dépendance est deux fichiers, en spécifiant que le premier fichier dépend de la seconde. Encore une fois ce sont les clés étrangères, la première est fixée à CASCADE (donc si je supprime une entrée de fichier, cet enregistrement est supprimé), mais le second est réglé sur RESTREIGNENT (donc je ne suis pas autorisé à supprimer une entrée de fichier si d'autres fichiers dépendent dessus). Encore une fois, tout semble bien.

Malheureusement, il semble que je ne peux plus supprimer un projet avec une seule instruction SQL supprimer! La suppression tente de cascade supprimer les fichiers, mais si l'un de ces éléments apparaît dans la table DEPENDANCES, la RESTREIGNENT clé étrangère empêche la suppression (même si sera supprimé ce fichier dans la table des dépendances parce que l'autre colonne est CASCADE). La seule solution que j'ai est de calculer un ordre précis pour supprimer les fichiers si aucune des contraintes d'enregistrement de dépendance ne sont pas respectés, et supprimer les enregistrements de fichiers un à la fois avant de retirer le projet.

Est-il possible de mettre en place mon schéma de base de données pour une seule SQL supprimer de la table projets seront correctement en cascade les autres suppressions? J'utilise Firebird 2.1, mais je ne sais pas si cela fait une différence - il semble qu'il devrait être un moyen de faire ce travail?

Créé 09/12/2008 à 19:51
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Est-ce que le soutien du système des contraintes Différé, dans lequel la vérification de la contrainte peut être différée jusqu'à ce qu'un point de validation?

Peut-être que juste une chose Oracle bien.

Créé 09/12/2008 à 20:11
source utilisateur

voix
4

Vous ne pouvez pas contrôler l'ordre de suppression par une cascade de clé étrangère, mais vous pourriez être en mesure de concevoir un déclencheur sur PROJECTSpour supprimer des lignes dans FILESqui appartiennent à ce projet et sont également répertoriés dans DEPENDENCIESdépendante de l' autre FILES. Faites - un BEFORE DELETEdéclencheur, il devrait donc exécuter avant que les effets en cascade.

Quelque chose comme ça:

CREATE TRIGGER Del_Child_Files FOR PROJECTS
BEFORE INSERT IGNORE 
AS BEGIN
  FOR SELECT F.FILE_ID FROM FILES F JOIN DEPENDENCIES D 
      ON F.FILE_ID = D.CHILD_ID
    WHERE F.PROJECT_ID = OLD.PROJECT_ID
    INTO :file_id
  DO
    DELETE FROM FILES WHERE FILE_ID = :file_id;
  DONE
END

Ainsi , lorsque vous supprimez un projet, cela supprime tous les fichiers « enfant » d'un projet qui dépendent d'autres fichiers, et cette cascade pour supprimer des lignes en DEPENDENCIESsorte que tous les fichiers restants sont exempts de dépendances. Votre suppression du projet peut maintenant en cascade pour supprimer ces fichiers.

Je n'ai pas testé et ma syntaxe Firebird peut-être rouillé, mais peut-être ça va commencer.

De toute évidence, s'il vous plaît vérifier ceci sur une copie de vos données, et non pas les données en direct!

Créé 09/12/2008 à 20:24
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more