Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Einfügen einer ID Spalte trotz identity erzwingen (https://www.delphipraxis.net/178188-einfuegen-einer-id-spalte-trotz-identity-erzwingen.html)

norwegen60 22. Dez 2013 02:32

Datenbank: MsSQL • Version: 2008 • Zugriff über: SQL

Einfügen einer ID Spalte trotz identity erzwingen
 
Hallo zusammen

ich habe eine Datenbank, die an 4 Standorte repliziert wird. Einige Tabellen nur ReadOnly für die Abonnenten, einige bidirektional. Problem ist, daß am Serverstandort Berechtigungen geändert wurden, und dadurch die Replikation für ein paar Tage nicht lief. Beim Reinitialisieren konnte nicht alle Daten von den Abonnenten zurück gewonnen werden. Nachdem die Replikation jetzt wieder sauber läuft, wollte ich jetzt per folgendem SQL die Daten aus dem Backup zurückspielen
Delphi-Quellcode:
SET IDENTITY_INSERT db.dbo.Table ON
GO
Insert into db.dbo.Table (ID, Feld1, Feld2, rowguid)
select ID, Feld1, Feld2, rowguid from Backup.dbo,Table
where (rowguid not in (select rowguid from db.dbo.Table ))
GO
SET IDENTITY_INSERT db.dbo.Table OFF
Im lokalen Test funktionierte das einwandfrei, in den Echtdaten wird das aber durch die Replikation verhindert. Es kommt die Meldung
Zitat:

The insert failed. It conflicted with an identity range check constraints in database db...
Der Hintergrund ist mir klar. Gibt es trotzdem eine Möglichkeit, das Einfügen der Daten, und sei es auf dem Server, mit den Original-ID zu erzwingen. Problem ist, dass andere Daten, die auf die Original-ID Bezug nehmen, repliziert wurden. Es wäre ein ziemlicher Aufwand, alle ID's incl. Beziehungen, zu korrigieren. Bin dankbar für jede Hilfe

Viele Grüße
Gerd

Furtbichler 22. Dez 2013 09:47

AW: Einfügen einer ID Spalte trotz identity erzwingen
 
Na, da ist ein identity range check constraint auf der Tabelle 'Table', d.h. die IDs sind in einem bestimmten Nummernbereich (z.B. > 100000000). Die IDs aus der Backuptabelle sind dann vermutlich nicht im gleichen Zahlenbereich.

Ohne den Constraint aufzuheben/erweitern wirst Du da wohl nichts machen können. Die IDs der Backuptabelle müssen nun mal da rein.

norwegen60 22. Dez 2013 10:41

AW: Einfügen einer ID Spalte trotz identity erzwingen
 
Hallo,

ja ich weiß. Frage ist aber wie ich das Band ausheble. Eine Möglichkeit wäre:
  • Replikation auf Verleger und Abonnent löschen
  • Daten einfügen
  • Replikation wieder herstellen
Die Replikation ist in 4 Teilreplikationen zerlegt da es mit einem Standort immer wieder Probleme gab wenn die Replikation zu umfangreich war. Dabei habe ich es dann gleich so aufgebaut, dass Teil 1 und 2 nur die readonly-Tabellen enthalten und die 2 anderen nach Anwendung gesplittet sind

Gibt es noch eine einfachere Möglichkeit das Band auszuhebeln bzw. wie kann ich den Constraint temporär erweitern? Ich hatte gehofft, dass IDENTITY_INSERT das auch für das Band tut

Wann wird eigentliche ein neues Nummernband generiert?
  • Klar ist, wenn Replikation komplett gelöscht und wieder erstellt wird
  • Wenn ich auf einem Abonnenten die Replikation initialisiere?
  • Wenn ich auf einem Verleger die Replikation initialisiere?
  • Wenn ich die Momentaufnahme manuell starte?
  • Wenn ich...

Grüße und Danke
Gerd

Furtbichler 22. Dez 2013 12:10

AW: Einfügen einer ID Spalte trotz identity erzwingen
 
Was meinst Du mit 'Band'?

So wie ich das sehe, wird die ID nicht reinpassen, egal ob Du den range check constraint kurz ausschaltest. Dann prüft er -soweit ich weiss- beim Aktivieren eben alle Werte und es knallt. Aber einen Versuch wäre es wert ('DROP CONSTRAINT').

norwegen60 22. Dez 2013 12:25

AW: Einfügen einer ID Spalte trotz identity erzwingen
 
Mit Band meinte ich den identity range. Wenn ich ne Replikation erzeuge, bekomme ich ja ein Range_begin range_end und ein next_range_begin und next_range_end zugewiesen, z.B. 6000..7000 und 7000..8000 zugwiesen und in max_used seh ich auch noch, wo ich mich gerade befinde.
Delphi-Quellcode:
select t.name, s.subscriber_server, s.db_name, m.range_begin, m.range_end, m.next_range_begin, m.next_range_end, m.is_pub_range, m.max_used
from MSmerge_identity_range m
INNER JOIN sysmergearticles t ON m.artid = t.artid
left outer JOIN sysmergesubscriptions s ON m.subid = s.subid
order by name, subscriber_server, range_begin
Das mit dem "Drop constraint" probier ich gleich mal aus

Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 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