MAC Adressen in unterschiedlichem Format

Mikee

Benutzer
Beiträge
8
Hallo liebe Comunity

Ich habe in einer Tabelle Mac-Adressen unterschiedlichen Formats gespeichert, welche ich nun in ein einheitliches Format (##:##:##:##:##:##) bringen muss. Zudem sollten die Buchstaben der Kette immer in Grossbuchstaben abgespeichert sein.

Aktuell sin die Werte in folgenden Formaten abgelegt:

00:l2:39:48:75:68
00:E4:L2:39:75:69
00L239487570
00-L2-39-48-75-7L

diese müssten nun so gespeichert werden:

00:L2:39:48:75:68
00:E4:L2:39:75:69
00:L2:39:48:75:70
00:L2:39:48:75:7L


1. Habt ihr mir einen Tipp, wie ich dies mittels SQL Queries hinbekomme?
2. Nach der Korrektur möchte ich gerne überwachen, dass keine neuen MAC-Adressen in einem falschen Format daher kommen. Wie könnte ich dies in einem Query am besten abfragen?

Vielen Dank für eure Hilfe
 
Werbung:
also erstmal alles mit Kleinbuchstaben mit uppercase auf Großbuchstaben ändern.
Dann bleiben ja nur noch 2 Fälle übrig, die man schön brav mit 2 passgenauen Statements updated. Jeweils eine passende Where Clause, die den 3. Buchstaben untersucht und das "set" dann mit substrings aus dem Originalwert und ":" zusammensetzen.

Da es keine RexExp Constraints in MSSQL gibt und vermutlich auch keinen MAC Typ, muss hier im Trigger konkret das Format geprüft werden und ein Fehler bei Verletzung geworfen werden.
 
deine Mac-Adressen sind offensichtlich alle falsch. Es gibt kein 'l', und auch kein 'L'. Verwende bitte, wenn Du sowas brauchst, eine Datenbank, die das kann. PostgreSQL z.B., die hat einen extra Datentyp für sowas.
 
Super danke. ja es ging auch nur um das Prinzip und ich habe fiktive Beispiele genannt. Nett wäre, wenn ein brauchbarer Input käme.
Ich brauche eine Lösung auf SQL Server, dementsprechend nützt mich dein wertvoller Tip mit der Postgres-DB nicht wirklich weiter.
 
tja, um Großbuchstaben zu bekommen:

Code:
test=*# select upper('12:34:56:78:90:ab'::macaddr::text);
       upper       
-------------------
 12:34:56:78:90:AB
(1 row)

test=*#

ist aber auch wieder nicht Deine DB.Schade aber auch ...
 
Lege eine neue Spalte in der Tabelle an und nutze ein externes Script, dass alles ausliest, parst und den neuen Wert in die Tabelle speichert.
Wenn alles passt, kannst Du wieder umswitchen. Mit Programmiersprachen wie Python, PHP, Java etc wäre das einfach.
Hier kannst Du auch täglich ein Script laufen lassen, dass per regular expression die MAC-Adressen überwacht.
 
Danke für den Tipp, lieber hätte ich diese direkt via SQL Query gemacht um hier nicht wieder von einem externen Programm "abhängig" zu sein. Hast du mir einen Hint wie ich an so ein externes Script kommen könnte?
 
Mit php könnte so etwas ungefähr so ausschauen:
Code:
<?php
$dbeintrag = "00L239487570";

if(strlen($dbeintrag) == 12 AND preg_match('/[A-Z0-9]{12}/', $dbeintrag )) {
echo macadr($dbeintrag)."\n";
}


// Erst String größer machen und splitten und : einfügen
function macadr($data) {
  $str = strtoupper($data);
  $temp = str_split($str);
 $macadr = $temp[0].$temp[1].":".$temp[2].$temp[3].":".$temp[4].$temp[5].".".$temp[6].$temp[7].":".$temp[8].$temp[9].":".$temp[10].$temp[11];
return $macadr;
}

Im Prinzip das Script dann erweitern:
Tabelle Zeile für Zeile durchgehen.
Das Script prüft ob die Mac-Adresse 12 Zeichen hat und nur aus Buchstaben oder Zahlen besteht.
Wenn ja, dann wird die MAC-Adresse erstellt und in der DB wieder zurückgeschrieben.
Du musst halt nur die vorhandenen Fälle abwickeln.
Z.B. wenn die Mac-Adresse gültig ist, auf Groß umwandeln oder bei der anderen Macadresse aus "-" ein ":" machen.

Grüße
Petra
 
Werbung:
Du kannst eine Funktion oder Procedure in Tsql schreiben, die die vorhandenen Daten korrigiert.
Für das korrekte eingeben kannst du evtl. ein RegEx Constraint Create Check Constraints - SQL Server schreiben, welches Daten nur im erlaubten Format annimmt oder eine Stores Procedure, bei der man die Mac Adresse angibt, diese von Sonderzeichen bereinigt wird und dann aufgeteilt wird.
z.B. Eingabe 11-22-22-33-DD-AA oder 11.22.22.33.DD.AA oder 11/22/22/33/dd/aa -> Wird zu -> 11222233DDAA -> und das wird zu -> 11:22:22:33:DD:AA
 
Zurück
Oben