AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi UpdateBatch und Unique Index
Thema durchsuchen
Ansicht
Themen-Optionen

UpdateBatch und Unique Index

Ein Thema von Peinhard · begonnen am 27. Sep 2006 · letzter Beitrag vom 28. Sep 2006
Antwort Antwort
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#1

UpdateBatch und Unique Index

  Alt 27. Sep 2006, 10:41
Datenbank: MSSQL • Version: 8 • Zugriff über: ADO
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: UpdateBatch und Unique Index

  Alt 27. Sep 2006, 10:44
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#3

Re: UpdateBatch und Unique Index

  Alt 27. Sep 2006, 10:51
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: UpdateBatch und Unique Index

  Alt 27. Sep 2006, 10:58
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#5

Re: UpdateBatch und Unique Index

  Alt 27. Sep 2006, 12:20
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: UpdateBatch und Unique Index

  Alt 27. Sep 2006, 18:52
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
  Mit Zitat antworten Zitat
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#7

Re: UpdateBatch und Unique Index

  Alt 28. Sep 2006, 08:35
Hallo marabu,

ja, das ist das momentane 'Design'.

Gruß, Peinhard
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: UpdateBatch und Unique Index

  Alt 28. Sep 2006, 09:01
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
  Mit Zitat antworten Zitat
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#9

Re: UpdateBatch und Unique Index

  Alt 28. Sep 2006, 09:18
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: UpdateBatch und Unique Index

  Alt 28. Sep 2006, 09:44
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 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