Hintergrund
Ich habe mein iPhone 4s umtauschen müssen. Durch den Gerätewechsel (alte SIM-Karte ins Tauschgerät), funktionierte der Profilmanager plötzlich nicht mehr. In der Konsole des Servers tauchte auch plötzlich folgende Meldung auf:

ProfileManager[462]: ActiveRecord::StatementInvalid (PGError: ERROR:  duplicate key value violates unique constraint "devices_ICCID_key" 
DETAIL:  Key ("ICCID")=(0000 0000 0000 0000 0000) already exists.

Hinweis: ICCID-Nummer lautete natürlich nicht 0000 0000 0000 0000 0000! 

Die Folge ist, dass das neue Gerät nicht korrekt in den Profilmanager hinzugefügt werden kann. Zu erkennen ist dies unter anderem auch daran, dass der Gerätenamen falsch angeben wird (bsp. “iPhone” oder “NewDevice”). Der Profilmanager versucht dauert Informationen einzuholen, dies gelingt ihm nicht…

Fehlerhafter Eintrag in der PostgreSQL-Datenbank
Informationen über Geräte und Benutzer werden vom Profil Manager in einer PostgreSQL-Datenbank abgelegt. Da nur mein Gerät getausch wurde, jedoch nicht meine SIM-Karte gab es ein Konflikt. Denn das “alte” Gerät wurde in der Datenbank mit der ICCID-Nummer meiner SIM-Karte verknüpft. Als ich nun mit der selben SIM-Karte ein weiteres Gerät verknüpfen wollte, kam es zum Konflikt… Komisch nur, dass dies mit meinen iPads nie vorgekommen ist. Diese teilen sich nämlich auch ständig eine SIM-Karte… Auf jeden Fall musste nun dieser Konflikt in der PostgreSQL-Datenbank gelöst werden. Diese ist zum Glück ähnlich aufgebaut wie eine mySQL-Datenbank.

Lösung
Am einfachsten klappt dies übers Terminal. In einem ersten Schritt nimmt man Kontakt mit der Datenbank auf:

sudo -u _devicemgr psql device_management

Nun wird dafür gesorgt, dass alles Detail sauber ausgegeben werden:

\x on;

Nun wird nach unserer ICCID-Nummer gesucht:

SELECT * FROM devices WHERE "ICCID" LIKE '0000 0000 0000 0000 0000';

Natürlich geben wir hier nicht die vielen Nullen ein, sondern exakt die ICCID-Nummer, welche die Konsole ständig ausgibt! Nun wird eine lange Liste ausgegeben mit vielen Informationen. Wenn ja, sind wir auf der richtigen Spur. Nun mit der Enter-Taste so lange bestätigen bis wir wieder bei der Befehlseingabe angelangt sind…

Nun wird der entsprechende Eintrag durch folgenden Befehl gelöscht:

DELETE FROM devices WHERE "ICCID" LIKE '0000 0000 0000 0000 0000';

Mit dem Befehl “exit” wird die PostgreSQL-Verbindung im Terminal verlassen. Damit der Serverdienst auch wirklich neu arbeitet. Stoppen wir PostgreSQL und starten ihn anschliessend neu. Dies wird folgendermassen im Terminal gleich gemacht:

sudo serveradmin stop postgres
sudo serveradmin start postgres

Um zu prüfen, ob der Serverdienst normal läuft, geben wir noch folgendes ein:

sudo serveradmin fullstatus postgres

Ist alles ok, gibt das Terminal folgendes aus:

postgres:dataDirHasBeenInitialized = yes
postgres:PG_VERSION = "9.0.5"
postgres:dataDir = "/var/pgsql"
postgres:postgresIsResponding = yes
postgres:dataDirIsDirectory = yes
postgres:PGserverVersion = 90005
postgres:dataDirExists = yes
postgres:setStateVersion = 1
postgres:state = "RUNNING"

Jetzt noch den Profilmanager aus-, bezüglich einschalten und das Pushen sollte wieder gehen.