ipliste in sql

Nemesis

Nemesis

N3RD
hi,
ich habe eine liste von netzwerkgeräten in einer datenbank und möchte mir nun ein script schreiben, das mir ausliest, welches die erste freie ip-adresse in diesem bereich ist.
gedacht habe ich mir das wie folgt:

Tabelle Geräte {Bezeichnung, IP}
Hilfstabelle Count{IP(Autoincrement)}

nun lässt man mittels einer abfrage Geräte.IP mit Count.IP vergleichen, und wenn die erste nicht-übereinstimmung kommt, dann bedeutet dies ja, dass diese IP nicht belegt ist.

oder wie würdet ihr herausfinden, welches die niedrigste freie ip ist?
 
Ich würd's mit "select max(IP) from Geräte" probieren....
 
Ich würd's mit "select max(IP) from Geräte" probieren....

Das wird nicht gehen, da die IP ja als varchar gespeichert sein wird, und er ja nicht die letzte belegte IP Adresse haben will, sondern die erste freie.

@Nemesis
Könntest du bitte mal die Tabelle mit samt den Datentypen (Zb als SQL Script) mit ein paar Beispieldaten posten?
Das würde die Sache erleichtern.
 
ah ja, stimmt, die erste freie....

Naja, warum dann nicht die freien in die Hilfstabelle, statt der belegten (die ja schon in der anderen stehen)?
 
Naja, warum dann nicht die freien in die Hilfstabelle, statt der belegten (die ja schon in der anderen stehen)?

jetzt komm ich noch gar vollens durcheinander ^^

ich hatte das so gedacht:

es gibt eine tabelle in der die netzwerkgeräte mit ip stehen, und eine in der die von mir reservierten ips stehen.
wenn ich nun ein neues gerät habe, möchte ich die erste freie und nicht reservierte ip zurückgegeben bekommen und diese soll dann in die tabelle mit den reservierten ips eingetragen werden, so dass wenn ich gleich noch eine ip benötige mir die nächste freie ausgegeben wird.

mein lösungsansatz ist:

tabellen:
Geräte(IP, Bezeichnung ...)
ReservierteIPs(IP)
HilfstabelleIPs( IP(Autoincrement) )

abfrage:
SELECT IP FROM Geräte UNION SELECT IP FROM ReservierteIPs left join HilfstabelleIPs

oder so ähnlich ...
 
Wenn du in der Hilfstabelle die freien IP-Adressen reinschreibst, (und aktuell hältst) kannst du doch aus der einfach die kleinste rauslesen... (Weiss ja nicht, über wie viele Adressen hier geredet wird...)
 
Die freien IP Adressen in die Datenbank schreiben ist quatsch.
Bei einem Class C Netz sind es ja schon allein 254 (oder 253?) Adressen pro Netz. Wenn man die alle in die Datenbank packt, schreibt man sich ja tot!

Ich sehe als einzige Möglichkeit das über ein externes Script zu machen. Also zB alle belegten IP Adressen aus der DB auslesen, und dann mit einem Bash, PHP, or what ever Script rechnen.
 
das geht auch mit sql ... wie gesagt die liste der vorhandenen ips mit einer liste in der von 1 bos 254 durchgezählt wird vergleichen und die erste die frei ist ausgeben.
ich will ja keine liste von freien ips, sondern immer wenn ich eine anfordere soll mir nur die niedrigste freie ausgegeben werden.
 
hm. Irgentwie checke ich das noch nicht so ganz...
Mach mal bitte nen Dump von deiner Datenbank und Poste mal hier.
Es müssen nicht die richtigen Daten sein, aber n paar Beispiel Daten zum Experimentieren wäre gut.
 
nimm doch einfach ne liste von ips in 2 tabellen und versuch da herauszubekommen welches die erste freie ist.
achja, die liste ligt als string, nicht als integer vor.
 
Zuletzt bearbeitet:
Wieso, was ist da Aufwand? Des eintragen erledigt doch 'n Script, oder? und afair funktoiniert min(blub) doch auch auf varchar's, oder nicht? Des ganze andere mit 10x belegte IP's speichern find ich aufwendig......
 
und selbst wenn min auf varchars funktioniert, was es nicht tut, denn da nimmt es nicht die wertigkeit der gesammten zahl sondern jeder einzelnen nacheinander, ichwill nicht die kleinste haben, sondern die kleinste die frei ist.
 
Keine Ahnung, welche Datenbank du verwendest, aber in Oracle könntest du evtl. etwa so die nächste freie Adresse im 192.168.1.*-Netz bekommen:
Code:
with byte4 as (select level "b" from dual connect by level < 255)
select '192.168.1.'||min(b) "IP"
from byte4 
where '192.168.1.'||b not in (select ip from geraete)

Im Prinzip erzeugst du also über eine "select level ... connect by"-Pseudoabfrage eine Liste möglicher Adressen, und überprüfst, ob die in der "geraete"-Tabelle bereits erfasst sind. Damit das funktioniert, müssen die IP-Adressen in der "geraete"-Tabelle natürlich entsprechend normiert/formatiert sein (keine führenden Nullen in den Adressbytes).

... das Ganze wie immer nur als Denkanstoss, ungetestet, ohne Rücksicht auf Performance etc. :)

Grüsse
 
also, ich habs heut realisiert, es funktioniert, in dem man mittels left join die beiden spalten der tabellen vergleicht und sich das erste ergebnis (sofern aufsteigend geordnet) ausgeben lässt.
 
Ich glaube du hast uns deine Tabellen nicht ordentlich beschrieben wenn das so läuft.
 
@sim: Doch ich hab es gelesen und fand es recht sinnvoll...
 
naja, hätt ich ja gemacht, wenn ich welche dagehabt hätte, aber die waren in der schule auf dem rechner, und da hatte ich heut "die erleuchtung" ;)
 

Ähnliche Themen

CentOS 5.8 –SQL Abfrage– HTML wird generiert und daraus müssen mehrere Mails versendet werden

Server-Monitoring mit RRDTool

Zurück
Oben