Foreign Key und Transaktion

01/08/2008 - 08:34 von Frank Ruthardt | Report spam
Hi,

ich habe folgendes Problem:

Tabelle Master
PK: id
text

Tabelle Child
PK: id
FK: Master_id
text

Dazwischen habe ich eine Foreign Key Beziehung zwischen Master.id und
Child.Master_id.

In den Tabellen habe ich zum Beispiel nun folgende Daten

Master:
1 | Text 1
2 | Text 2
3 | Text 3
4 | Text 4

Child:
1 | 1 | Untertext 1
2 | 2 | Untertext 2
3 | 3 | Untertext 3
4 | 4 | Untertext 4

Jetzt möchte ich einen Datensatz in Master löschen:
delete from master where id = 3

Dabei bekomme ich natürlich eine FK-Verletzung (on Delete Cascade ist nicht
drin)

Wenn ich aber nun folgendes mache:
update child set master_id=4 where master_id=3

Würde ich natürlich den Konflikt lösen.


Nun habe ich das Problem, dass ich das gleichzeitig tun muss, also habe ich
eine Transaktion darum gebaut:

begin transaction
delete from master where id = 3;
update child set master_id=4 where master_id=3;
commit

Kann man dem SQL-Server irgendwie abgewöhnen dass er Foreign Keys direkt
prüft, also dass er es erst am Ende der Transaction tut?

Ich weiß ich könnte einfach die Reihenfolge umstellen, ist aber leider net
praktikabel, kann von meinem Programm nicht garentieren wer zuerst
gespeichert wird ob Master oder Child.

Liebe Grüße
Frank
 

Lesen sie die antworten

#1 Elmar Boye
01/08/2008 - 09:40 | Warnen spam
Hallo Frank,

Frank Ruthardt schrieb:
Hi,

ich habe folgendes Problem:

Tabelle Master
PK: id
text

Tabelle Child
PK: id
FK: Master_id
text

Dazwischen habe ich eine Foreign Key Beziehung zwischen Master.id und
Child.Master_id.

Jetzt möchte ich einen Datensatz in Master löschen:
delete from master where id = 3

Dabei bekomme ich natürlich eine FK-Verletzung (on Delete Cascade ist
nicht drin)

Nun habe ich das Problem, dass ich das gleichzeitig tun muss, also habe
ich eine Transaktion darum gebaut:

begin transaction
delete from master where id = 3;
update child set master_id=4 where master_id=3;
commit

Kann man dem SQL-Server irgendwie abgewöhnen dass er Foreign Keys direkt
prüft, also dass er es erst am Ende der Transaction tut?



Nein, Deferred Constraints, die das ermöglichen würden,
unterstützt der SQL Server nicht.

Ich weiß ich könnte einfach die Reihenfolge umstellen, ist aber leider
net praktikabel, kann von meinem Programm nicht garentieren wer zuerst
gespeichert wird ob Master oder Child.



Das ist aber die einzige Möglichkeit.
(Gàngige OR Mapper verwalten z. B. intern die Beziehungen und
stellen so eine "richtige" Änderungs/Löschreihenfolge sicher).

Gruß Elmar

Ähnliche fragen