Dynamische Felder konvertieren?
Dynamische Felder konvertieren?
Hi,
nach dem Update von einem OTRS 2.4.9 auf die aktuelle 5er Version würde ich gerne die Datenbank ein wenig aufräumen.
Insbesondere wurden zahlreiche FreeKey/FreeText-Felder übernommen, die ich nun gerne in neu angelegte DynamicFields übertragen würde.
Gibt es dafür evtl. ein fertiges Skript oder so?
nach dem Update von einem OTRS 2.4.9 auf die aktuelle 5er Version würde ich gerne die Datenbank ein wenig aufräumen.
Insbesondere wurden zahlreiche FreeKey/FreeText-Felder übernommen, die ich nun gerne in neu angelegte DynamicFields übertragen würde.
Gibt es dafür evtl. ein fertiges Skript oder so?
Re: Dynamische Felder konvertieren?
Hi
die sollten durch die Migration bereits umgewandelt sein.
Flo
die sollten durch die Migration bereits umgewandelt sein.
Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
Re: Dynamische Felder konvertieren?
Dann habe ich offenbar was falsch gemacht. Ich habe jedenfalls hier nur einen Haufen Dynamischer Felder mit Namen "TicketFreeKey<NR>" und "TicketFreeText<NR>". Eine korrekt Umwandlung in dynamische Felder Key => Value hat nicht stattgefunden.
Re: Dynamische Felder konvertieren?
Hi,
der Name des Dynamischen Feldes ändert sich durch die Migration nicht.
Heissen tun die so wie vorher (FreeKey1 oder was)
Alle die, die nicht benutzt wurden sollten zumindest auf invalid gesetzt worden sein.
Wenn Du während der Migrationen keine Fehler hattest, sollte es schon passen.
Flo
der Name des Dynamischen Feldes ändert sich durch die Migration nicht.
Heissen tun die so wie vorher (FreeKey1 oder was)
Alle die, die nicht benutzt wurden sollten zumindest auf invalid gesetzt worden sein.
Wenn Du während der Migrationen keine Fehler hattest, sollte es schon passen.
Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
Re: Dynamische Felder konvertieren?
Das entspricht aber eigentlich nicht dem, was ich möchte.
Ich hätte gerne, dass alle Felder, deren Key im alten System XY lautete nach der Migration in einem Dynamischen Feld mit dem Namen "XY" stecken.
Daher halt die Frage nach einer Konvertierung.
Ich hätte gerne, dass alle Felder, deren Key im alten System XY lautete nach der Migration in einem Dynamischen Feld mit dem Namen "XY" stecken.
Daher halt die Frage nach einer Konvertierung.
Re: Dynamische Felder konvertieren?
Hi,
Musst du manuell ändern.
Flo
Musst du manuell ändern.
Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
Re: Dynamische Felder konvertieren?
Wenn du in OTRS das neue dynamische Feld anlegst, dann kannst du in der Datenbank in der Tabelle 'dynamic_field' die id deines neu angelegten Feldes auslesen.ncmbu wrote:Das entspricht aber eigentlich nicht dem, was ich möchte.
Ich hätte gerne, dass alle Felder, deren Key im alten System XY lautete nach der Migration in einem Dynamischen Feld mit dem Namen "XY" stecken.
Daher halt die Frage nach einer Konvertierung.
Anschließend musst du nur noch in der Tabelle 'dynamic_field_value' die Spalte „field_id“ durch die ID deines angelegten Feldes ersetzen.
Re: Dynamische Felder konvertieren?
Bei 80000+ Einträgen in der dynamic_field_value-Tabelle will ich die nicht wirklich manuell durchgehen, selbst wenn ich davon ausgehe, dass ich die Hälfte ignorieren kann (weils die Keys sind) ist das immer noch zu viel um es per Hand anzupassen.wurzel wrote: Musst du manuell ändern.
Zuerst muss ich ja irgendwie die Zeilen selektieren, die entsprechend angepasst werden müssen. Das funktioniert dann recht gut, wenn die Werte vorhersehbar sind (z.B. auf ein RegExp passen), aber bei scheinbar willkürlichen Werten muss ich zwingend den Key berücksichtigen.Ebebalf wrote:Anschließend musst du nur noch in der Tabelle 'dynamic_field_value' die Spalte „field_id“ durch die ID deines angelegten Feldes ersetzen.
Außerdem funktioniert es so simpel auch nur, wenn ich Felder anpasse, die vom Typ "Ticket" sind. Wenn ich Felder, die sich eigentlich auf Artikel beziehen anpassen will muss ich zudem noch die object_id vom Ticket auf den Artikel ändern.
Ich hatte gehofft, dass jemand möglicherweise schon mal eine ähnliche Anforderung hatte und es ein Skript gäbe, dass diese Prozesse automatisiert.
Re: Dynamische Felder konvertieren?
Hi,
also dann versteh' ich Dich nicht.
Du kannst doch einfach nur den Namen des dynamischen Feldes ändern. Reicht Dir das nicht? So ganz hab' ich nicht nachvollziehen können, wo genau Dein Problem liegt und was Dein Ziel ist
Flo
also dann versteh' ich Dich nicht.
Du kannst doch einfach nur den Namen des dynamischen Feldes ändern. Reicht Dir das nicht? So ganz hab' ich nicht nachvollziehen können, wo genau Dein Problem liegt und was Dein Ziel ist
Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
Re: Dynamische Felder konvertieren?
Dann versuche ich das mal anhand eines Beispiels zu erklären:
Im alten OTRS hatten wir verschiedene Freitext-Felder, zum Beispiel: "Ort", "Telefon" etc.
Beispiel-Screenshot: Da aber sowohl die Keys, als auch die Werte frei eingetragen werden konnten ist die Reihenfolge hier nicht fest.
Nach der Migration auf OTRS 5 habe ich jetzt die dynamischen Felder TicketFreeKey1 bis TicketFreeKey3 und TicketFreeText1 bis TicketFreeText3.
Screenshot: Jetzt ist aber zum Beispiel bei einem Ticket der String "Ort" in TicketFreeKey1 gespeichert, bei einem anderen aber in TicketFreeKey3. Der dazugehörige Wert ist entsprechend mal im Feld TicketFreeText1 und mal in TicketFreeText3. Ich kann also keines dieser Felder einfach umbenennen, weil in jedem der Felder alle möglichen Werte drin sein können.
Im alten OTRS hatten wir verschiedene Freitext-Felder, zum Beispiel: "Ort", "Telefon" etc.
Beispiel-Screenshot: Da aber sowohl die Keys, als auch die Werte frei eingetragen werden konnten ist die Reihenfolge hier nicht fest.
Nach der Migration auf OTRS 5 habe ich jetzt die dynamischen Felder TicketFreeKey1 bis TicketFreeKey3 und TicketFreeText1 bis TicketFreeText3.
Screenshot: Jetzt ist aber zum Beispiel bei einem Ticket der String "Ort" in TicketFreeKey1 gespeichert, bei einem anderen aber in TicketFreeKey3. Der dazugehörige Wert ist entsprechend mal im Feld TicketFreeText1 und mal in TicketFreeText3. Ich kann also keines dieser Felder einfach umbenennen, weil in jedem der Felder alle möglichen Werte drin sein können.
You do not have the required permissions to view the files attached to this post.
Re: Dynamische Felder konvertieren?
Hi,
das sieht danach aus, als wären die Dynamischen Felder (bzw. FreeTextFelder der Version2) von Anfang an falsch angelegt waren.
Normalerweise ist nämlich die Konvertierung/Migration problemlos.
Da kann ich Dir dann leider auch nicht weiterhelfen. Dieses Issue ist mir nicht bekannt. Sorry
viele Grüße
Flo
das sieht danach aus, als wären die Dynamischen Felder (bzw. FreeTextFelder der Version2) von Anfang an falsch angelegt waren.
Normalerweise ist nämlich die Konvertierung/Migration problemlos.
Da kann ich Dir dann leider auch nicht weiterhelfen. Dieses Issue ist mir nicht bekannt. Sorry
viele Grüße
Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11
-- Ich beantworte keine Forums-Fragen PN - No PN please
I won't answer to unfriendly users any more. A greeting and regards are just polite.
Re: Dynamische Felder konvertieren?
Hallo,
ich habe die Dynamischen Felder in der Datenbank jetzt manuell angepasst. Dafür habe ich mir ein paar komplexere SQL-Queries gebaut. Da ich diese vermutlich nie wieder benötigen werde, aber vielleicht irgendwann man jemand anders vor dem gleichen Problem stehen könnte, wollte ich diese hier dokumentieren:
Also die Grundvoraussetzung ist, wie in meinem Fall beschrieben: Nach Updates bestehen eine Reihe von FreeKey<X> und FreeText<X> Feldern, bei denen jeweils im FreeKey<X> ein eindeutiger Bezeichner steht, dessen Wert im zugehörigen FreeText<X> zu finden ist, wobei die Zahl X unterschiedliche sein kann und in keinem Zusammenhang zum Inhalt des Keys steht. Das ganze soll jeweils in ein neues dynamisches Feld überführt werden, dessen Name dem Key entspricht (bzw. der Name kann auch völlig anders sein, entscheidend ist, dass die Werte eines Keys in ein neues dynamisches Feld übertragen werden sollen).
Vorarbeit:
Da ich nicht aus der gleichen Tabelle lesen und schreiben will verschiebe ich erstmals die existierende Tabelle:Anschließend muss die eigentliche Tabelle neu erstellt werden:
Die Ausgabe des ersten Befehls kann kopiert und der Name angepasst werden. Unter Umständen kann die neue Tabelle nicht angelegt werden, weil ein ForeignKeey-Constraint den gleichen Namen hat wie in der existierenden. Dann muss man diesen von der alten Tabelle entfernen; z.B:
Somit sind unsere Vorarbeiten abgeschlossen. Wir haben jetzt eine neue, leere dynamic_field_values-Tabelle und unsere Ausgangsdaten befinden sich in der Tabelle dynamic_field_val_bak. (Achtung: Sollten weitere reguläre dynamische Felder bestehen, müssen die entsprechenden Einträge nun ebenfalls in die neue Tabelle übertragen werden)
Konvertierung:
Nachdem die Vorarbeiten abgeschlossen wurden, geht es an die Konvertierung. Die neuen dynamischen Felder sollten bereits angelegt sein (Typ Ticket oder Typ Article). Mit folgendem Query kann man sich die zugehörigen IDs anzeigen lassen:
Die IDs benötigen wir nun in den nächsten Schritten. Für jedes zu konvertierende Feld sind die folgenden Schritte separat auszuführen:
Hier werden zwei Variablen gesetzt.
@key enthält den String, nach dem im folgenden in den FreeKey<X>-Werten gesucht wird.
@kid enthält die ID zu dem dynamischen Feld, welches die Werte aus den FreeText<X>-Feldern zugewiesen bekommt (aus der Liste übernommen).
Die COLLATE-Angaben musste ich in meinem Fall machen, da ich sonst beim nächsten Schritt eine Fehlermeldung erhalten hätte; evtl. geht es bei anderen auch ohne.
Nun gilt es zu unterscheiden: Handelt es sich bei dem neuen dynamischen Feld um ein Feld vom Typ Ticket, oder um ein Feld vom Typ Article? Beim Typ Article bestünde im Grunde die zusätzliche Frage welchem Artikel innerhalb eines Tickets das Feld zugeordnet werden muss. In meinem Fall war es jedoch so, dass die Felder immer zum ersten Artikel eines Tickets gehört haben.
Hier jedenfalls die auszuführenden SQL-Statements:
Fall Ticket:
Fall Article:
Anschließend die Variablen @key und @kid anpassen und für's nächste Feld fortfahren.
Hinweise:
Bei dem SQL-Query habe ich mir zu Nutze gemacht, dass die ID der FreeKey<X> Felder immer genau eins kleiner war, als das zugehörige FreeText<X>-Feld. Ich glaube dies ist Standard, aber sollte jemand dies nachmachen wollen, prüft dies für eure Tabelle nochmals!
Die IDs der FreeKey<X>-Felder, die überprüft werden sind in dem IN-Statement (1,3,5,7); für meinen Fall hat es gereicht vier Felder zu prüfen. Auch hier: Das muss nicht immer so sein.
Das war's.
ich habe die Dynamischen Felder in der Datenbank jetzt manuell angepasst. Dafür habe ich mir ein paar komplexere SQL-Queries gebaut. Da ich diese vermutlich nie wieder benötigen werde, aber vielleicht irgendwann man jemand anders vor dem gleichen Problem stehen könnte, wollte ich diese hier dokumentieren:
Also die Grundvoraussetzung ist, wie in meinem Fall beschrieben: Nach Updates bestehen eine Reihe von FreeKey<X> und FreeText<X> Feldern, bei denen jeweils im FreeKey<X> ein eindeutiger Bezeichner steht, dessen Wert im zugehörigen FreeText<X> zu finden ist, wobei die Zahl X unterschiedliche sein kann und in keinem Zusammenhang zum Inhalt des Keys steht. Das ganze soll jeweils in ein neues dynamisches Feld überführt werden, dessen Name dem Key entspricht (bzw. der Name kann auch völlig anders sein, entscheidend ist, dass die Werte eines Keys in ein neues dynamisches Feld übertragen werden sollen).
Vorarbeit:
Da ich nicht aus der gleichen Tabelle lesen und schreiben will verschiebe ich erstmals die existierende Tabelle:
Code: Select all
ALTER TABLE dynamic_field_value RENAME dynamic_field_val_bak;
Code: Select all
SHOW CREATE TABLE dynamic_field_val_bak;
CREATE TABLE `dynamic_field_value` …
Code: Select all
ALTER TABLE dynamic_field_val_bak DROP FOREIGN KEY `FK_dynamic_field_value_field_id_id`;
Konvertierung:
Nachdem die Vorarbeiten abgeschlossen wurden, geht es an die Konvertierung. Die neuen dynamischen Felder sollten bereits angelegt sein (Typ Ticket oder Typ Article). Mit folgendem Query kann man sich die zugehörigen IDs anzeigen lassen:
Code: Select all
SELECT id,name FROM dynamic_field;
Code: Select all
SET @key = "Schluesselwert" COLLATE utf8_general_ci;
SET @kid = "47" COLLATE utf8_general_ci;
@key enthält den String, nach dem im folgenden in den FreeKey<X>-Werten gesucht wird.
@kid enthält die ID zu dem dynamischen Feld, welches die Werte aus den FreeText<X>-Feldern zugewiesen bekommt (aus der Liste übernommen).
Die COLLATE-Angaben musste ich in meinem Fall machen, da ich sonst beim nächsten Schritt eine Fehlermeldung erhalten hätte; evtl. geht es bei anderen auch ohne.
Nun gilt es zu unterscheiden: Handelt es sich bei dem neuen dynamischen Feld um ein Feld vom Typ Ticket, oder um ein Feld vom Typ Article? Beim Typ Article bestünde im Grunde die zusätzliche Frage welchem Artikel innerhalb eines Tickets das Feld zugeordnet werden muss. In meinem Fall war es jedoch so, dass die Felder immer zum ersten Artikel eines Tickets gehört haben.
Hier jedenfalls die auszuführenden SQL-Statements:
Fall Ticket:
Code: Select all
INSERT INTO dynamic_field_value (field_id,object_id,value_text) SELECT @kid AS field_id,B.object_id,TRIM(B.value_text) AS value_text FROM dynamic_field_val_bak AS A, dynamic_field_val_bak AS B WHERE (A.object_id=B.object_id AND (A.field_id IN (1,3,5,7)) AND (A.field_id=B.field_id-1) AND A.value_text=@key);
Code: Select all
INSERT INTO dynamic_field_value (field_id,object_id,value_text) SELECT @kid AS field_id,C.id AS object_id,TRIM(B.value_text) AS value_text FROM dynamic_field_val_bak AS A, dynamic_field_val_bak AS B LEFT JOIN (SELECT MIN(id) AS id, ticket_id FROM article GROUP BY ticket_id) AS C ON (B.object_id = C.ticket_id ) WHERE (A.object_id=B.object_id AND (A.field_id IN (1,3,5,7)) AND (A.field_id = B.field_id-1) AND A.value_text=@key);
Hinweise:
Bei dem SQL-Query habe ich mir zu Nutze gemacht, dass die ID der FreeKey<X> Felder immer genau eins kleiner war, als das zugehörige FreeText<X>-Feld. Ich glaube dies ist Standard, aber sollte jemand dies nachmachen wollen, prüft dies für eure Tabelle nochmals!
Die IDs der FreeKey<X>-Felder, die überprüft werden sind in dem IN-Statement (1,3,5,7); für meinen Fall hat es gereicht vier Felder zu prüfen. Auch hier: Das muss nicht immer so sein.
Das war's.