2017-07-18 8 views
0

Nach einigen Änderungen in der DB, einige Benutzer doppelt (aber mit anderen Werte). Wenn Benutzer versuchen, sich anzumelden, melden sie sich bei dem Konto mit dem neuen Wert user_key an und sehen daher keinen Verlauf des Kontos.Bitten um Ideen, um user_key Felder zu wechseln

In der Tabelle alles sieht wie folgt aus:

user_key       username lower_username 
-------------------------------- -------- -------------- 
8ad7d2d65d424a40015d424b57500107 mtamu  mtamu   <- duplicated user 
8ada96025245dad801535faba00d016e mtamu  NULL   <- old user 

ich den alten Benutzer user_key Wert zu kopieren versucht, bekam aber einen Fehler:

UPDATE user_mapping 
SET user_key = '8ada96025245dad801535faba00d016e' WHERE user_key = '8ad7d2d65d424a40015d424b57500107' 

Violation of PRIMARY KEY constraint 'PK__user_map__E1CC8CC0049C3729'. Cannot insert duplicate key in object 'dbo.user_mapping'. The duplicate key value is (8ada96025245dad801535faba00d016e).

ich ohne Glück noch eine andere Idee versucht :

UPDATE user_mapping 
SET user_key = '1' WHERE user_key = '8ada96025245dad801535faba00d016e' 

UPDATE user_mapping 
SET user_key = '8ada96025245dad801535faba00d016e' WHERE user_key = '8ad7d2d65d424a40015d424b57500107' 

The UPDATE statement conflicted with the REFERENCE constraint "FK_CONTENT_LABEL_OWNER". The conflict occurred in database "confluence5_8_18", table "dbo.CONTENT_LABEL", column 'OWNER'.

Ich frage nach Ideen, wie Benutzer ihre alten Konten anmelden können.

+0

löschen Sie einfach das Duplikat ... – scsimon

+1

Was DBMS? (Sieht aus wie SQL Server) – RBarryYoung

+0

Es ist SQL Server – Marijus

Antwort

0

Wenn keine Löschkaskade vorhanden ist, nur DELETE der zu ersetzende Wert.
Dann UPDATE der eine als neuen Wert zu ändern.

Wenn Konflikte mit einem referenzierten FOREIGN KEY,
bestehen, entfernen Sie die Einschränkungen, bevor Sie die DELETE ausführen.

So stellen Sie sicher darauf, dass keine FOREIGN KEY Referenzen der Schlüssel @wrongValue,
wenn es so ist, sollten Sie UPDATE auch die ausländischen Spalten auf den neuen Wert.

DECLARE @normalValue as varchar(max); 
DECLARE @wrongValue as varchar(max); 
SET @normalValue = '8ada96025245dad801535faba00d016e'; 
SET @wrongValue = '8ad7d2d65d424a40015d424b57500107'; 

IF (SELECT COUNT(user_key) FROM user_mapping WHERE user_key = @wrongValue) > 0 
BEGIN 
    ALTER TABLE user_mapping NOCHECK CONSTRAINT ALL; 

    DELETE user_mapping 
    WHERE user_key = @normalValue; 

    UPDATE user_mapping 
    SET user_key = @normalValue 
    WHERE user_key = @wrongValue; 

    ALTER TABLE user_mapping CHECK CONSTRAINT ALL; 

    UPDATE dbo.CONTENT_LABEL 
    SET Owner = @normalValue 
    WHERE Owner = @wrongValue; 
END 
Verwandte Themen