Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi UpdateBatch und Unique Index (https://www.delphipraxis.net/77966-updatebatch-und-unique-index.html)

Peinhard 27. Sep 2006 10:41

Datenbank: MSSQL • Version: 8 • Zugriff über: ADO

UpdateBatch und Unique Index
 
Folgendes Szenario: ich lade im Modus ltBatchOptimistic eine Tabelle mit Positionen, die anhand einer PosNr, auf der ein Unique Index liegt, sortiert werden. Sortiere ich diese Positionen jetzt um - vertausche also bspw zwei PosNr - und rufe dann UpdateBatch auf, setzt es natürlich schon beim ersten Update-Statement eine Schlüsselverletzung (weil zB PosNr 4 zu PosNr 3 geändert werden soll, während die ursprüngliche PosNr 3 noch unverändert in der DB steht).

Wie geht ihr mit diesem Problem um?

mkinzler 27. Sep 2006 10:44

Re: UpdateBatch und Unique Index
 
Erst die eine ans Ende Schieben (unbelegte PosNr) dann die 2. an die ursprüngliche Stelle der ersten, dann diese an die ursprünglich Stelle der 2.

Peinhard 27. Sep 2006 10:51

Re: UpdateBatch und Unique Index
 
Hallo m,

is schon klar, so mache ich das natürlich auch, wenn ich direkt auf der Datenbank arbeite. Hier aber ist der Dataset 'abgekoppelt' und es können beliebig viele Umsortierungen vorgenommen werden, die dann 'in eins' zurückgeschrieben werden sollen. Wie würdest du da vorgehen?

mkinzler 27. Sep 2006 10:58

Re: UpdateBatch und Unique Index
 
Vielleicht die lokale Kopie um ein Feld erweitern, das die alte Position aufnimmt.
Dann die alten Datensätze in der Datenbank anhand der alten Positionen lLschen und an die neuen Anfügen.

BTW. Es ist immer gefährlich Positionen zu ändern.

Peinhard 27. Sep 2006 12:20

Re: UpdateBatch und Unique Index
 
Auf sowas wird es wohl hinauslaufen: vor einem UpdateBatch alle Records durchgehen und eventuelle Pos-Änderungen feststellen (dazu bietet sich auch OriginalValue an). Wenn es eine solche gibt, alle Records, die auf rsModified stehen erst löschen und dann für jeden rsModified/rsInsert eigene Insert-Statements absetzen, den ganzen UpdateBatch mittels CancelUpdates 'verwerfen'. Alternativ den Unique Index verwerfen. Alles nicht richtig 'schön', aber die Funktionalität wird gewünscht.

Fällt jemandem noch etwas eleganteres ein?

marabu 27. Sep 2006 18:52

Re: UpdateBatch und Unique Index
 
Hallo Peinhard,

ist deine Tabelle eine Detailtabelle aus einer 1:n Beziehung? Und ist die PosNr Teil eines compound primary key (foreignKey, posNr)?

Grüße vom marabu

Peinhard 28. Sep 2006 08:35

Re: UpdateBatch und Unique Index
 
Hallo marabu,

ja, das ist das momentane 'Design'.

Gruß, Peinhard

marabu 28. Sep 2006 09:01

Re: UpdateBatch und Unique Index
 
Dann kann das unique constraint aber nicht auf PosNr alleine liegen - und der compound key ist ja wegen primary bereits unique. Ich denke das Problem ist hausgemacht. Kannst du nicht einen surrogate key (identity) in der Detailtabelle einführen? Dann wird nur noch ein sort index auf (foreignKey, PosNr) benötigt, welcher nicht unique sein muss. Die Behandlung der PosNr bei Verschiebungen kannst du dann prinzipiell so machen, wie Markus beschrieben hat, allerdings im Puffer - so sollte der batch update möglich sein und auch keinen Grund zum Meckern finden.

Grüße, marabu

Peinhard 28. Sep 2006 09:18

Re: UpdateBatch und Unique Index
 
Wenn ich dich recht verstehe meinte ich das, absichtlich etwas 'unscharf' formuliert, mit 'Verwerfen' des Unique Index. Nachteil wäre, das es von seiten der DB keine 'Versicherung' gegen doppelte PosNr (bzw Doppelpärchen foreign key/PosNr) mehr gäbe. Verstehe ich dich richtig...?

Das Verschieben im Puffer ist ohnehin kein Problem.

Gruß, Peinhard

marabu 28. Sep 2006 09:44

Re: UpdateBatch und Unique Index
 
Die Absicherung gegen doppelte "PosNr" hast du, wenn der Benutzer die "PosNr" nicht direkt manipulieren kann und das Vertauschen von Positionsnummern durch eine Exchange()-Routine von dir erledigt wird.

Grüße, marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz