AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL Select gesucht - IP Adresse zwischen IP Min und IP Max
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

Ein Thema von Piro · begonnen am 8. Dez 2014 · letzter Beitrag vom 10. Dez 2014
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 8. Dez 2014, 21:14
Datenbank: MS SQL • Version: 2008 • Zugriff über: ADO
Moin zusammen,

ich habe 2 MS SQL Tabelle. Die 1. Tabelle hält Computer Information mit der IP Adresse (z.B. 192.168.29.29). Die 2. Tabelle hat die Informationen über die Bereiche mit Zusatzinformation, wie dem Standort (z.B.: Gebäude, Raum).

Definition der 1. Tabelle für die IP:
Code:
name varchar(20) null,
ip varchar(15) null

// Beispieldaten
Name       | IP
----------------------------------
Computer1  | 192.168.99.29
Computer2  | 192.168.99.250
Computer3  | 192.168.100.29
Computer4  | 192.168.100.225
Definition der 2. Tabelle:
Code:
ip_min varchar(15) null,
ip_max varchar(15) null,
location varchar(50) null

// Beispieldaten
IP Min          | IP Max          | Location
--------------------------------------------
192.168.99.1    | 192.168.99.125  | Raum 1
192.168.99.126  | 192.168.100.125 | Raum 2
192.168.100.126 | 192.168.100.254 | Raum 3
Leider fehlt mir das Wissen, wie man sowas machen kann. Mit Google habe ich einige Sachen gefunden aber nicht nachvollziehen können.
Ein Ansatz wäre, dass man die IP Adressen in Integer umwandelt und dann folgendes macht.
Code:
Select t1.name, t1.ip, t2,location from table1 as t1, table2 as t2 where t1.ip between t2.ip_min and t2.ip_max
Nur wie wandle ich die IPs richtig um? Das 3. Oktett ist zum Beispiel 2stellig und könnte auch 3stellig sein.

Folgendes Ergebnis benötige ich, wenn das Select Statement gefunden ist.
Code:
Computer1 | 192.168.99.29   | Raum 1
Computer2 | 192.168.99.250  | Raum 2
Computer3 | 192.168.100.29  | Raum 2
Computer4 | 192.168.100.225 | Raum 3
Vielen Dank im Voraus für eure Ideen oder Anregungen.

Sven
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 8. Dez 2014, 21:57
Die IP-Adresse (so wie landläufig bekannt) ist ja nur ein wenig human readable gestaltet. Es sind schlicht 4 Bytes. Diese Bytes sind dezimal dargestellt und jeweils mit Punkten getrennt. Du musst die IP-Adresse also an den Punkten auseinander pflücken und dann bekommst du die 4 Byte-Werte und kannst daraus einen Integer-Wert bauen.

Sinnvoller wäre die Adresse gleich als Integer zu speichern, denn aus dem echten Wert lässt sich immer einfacher die Darstellung ableiten, als aus der Darstellung der echte Wert.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#3

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 8. Dez 2014, 23:59
Sinnvoller wäre die Adresse gleich als Integer zu speichern
Und noch sinnvoller wäre es, wenn man außerdem die Adressbereiche mit Subnetzmasken speichern würde.

Aber ich vermute du hast keinen Einfluss darauf?
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 9. Dez 2014, 00:22
Und noch sinnvoller wäre es, wenn man außerdem die Adressbereiche mit Subnetzmasken speichern würde.
Na dann, viel Spaß bei

Zitat:
192.168.99.126 | 192.168.100.125 | Raum 2
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#5

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 9. Dez 2014, 00:26
Deshalb meinte ich ja, dass er da wohl keinen Einfluss drauf haben wird.

Kommt halt davon, wenn man sich nicht an etablierte Standards hält. Jetzt muss man da halt durch.

Aber wie schon erwähnt wurde, kann man die IPs einfach in Ints umrechnen und dann ganz leicht vergleichen.

Edit: Übrigens nennt man die Funktionen dafür inet_ntoa und inet_aton. Hilft sicher beim googlen!
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#6

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 9. Dez 2014, 00:30
http://delphi.cjcsoft.net/viewthread.php?tid=43860

RtlIpv4StringToAddress function

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
-----------------------
inet_addr function

http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

http://blogs.msdn.com/b/johnbreakwel...ord-value.aspx

Geändert von hathor ( 9. Dez 2014 um 00:34 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 9. Dez 2014, 07:06
Code:
select
  right('000'+ cast(
  substring(ip,1, charindex('.',ip)-1)
  as varchar),3),
  right('000'+ cast(
  substring(ip, charindex('.',ip)+1,
                charindex('.',ip,charindex('.',ip)+1)-charindex('.',ip)-1)
  as varchar),3)
from (select '92.68.1.122' as ip) x
Den 3. und 4. Wert kannst Du sicher selbst konstruieren.
Eine Funktion wäre natürlich elegantger.
Am Ende die 4 Werte verketten und man kann mit <> between arbeiten. Schnell wird das aber wahrscheinlich nicht ohne weiteres, Standardindex greift da nicht.
Gruß, Jo
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#8

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 9. Dez 2014, 16:51
Schnell mal gebastelt ..


SQL Funktion "IPAddressBetween(Adresse, Bereich-Beginn, Bereich-Ende)"


Delphi-Quellcode:
SELECT dbo.IPAddressBetween('192.168.10.10','192.168.10.11','192.168.10.100');
 >> 0

SELECT dbo.IPAddressBetween('192.168.10.10','192.168.10.1','192.168.10.100');
 >> 1
In der DB musst Du dafür einmalig 2 Skalarwertfunktionen anlegen.
Vorab .. Ja. Das Errorhandling bei Übergabe falscher Werte kannst Du selbst einbauen.

Code:
CREATE FUNCTION [dbo].[IPStringToInt](
   @IPAddressString VARCHAR(15)
   )
RETURNS BIGINT
BEGIN

   declare @Oktett1 TinyInt;
   declare @Oktett2 TinyInt;
   declare @Oktett3 TinyInt;
   declare @Oktett4 TinyInt;

   declare @OktettWert1 BIGINT;
   declare @OktettWert2 BIGINT;
   declare @OktettWert3 BIGINT;
   declare @OktettWert4 BIGINT;

   declare @result BIGINT = -1;

    SELECT @Oktett1 = PARSENAME(@IPAddressString,4);
   SELECT @Oktett2 = PARSENAME(@IPAddressString,3);
   SELECT @Oktett3 = PARSENAME(@IPAddressString,2);
   SELECT @Oktett4 = PARSENAME(@IPAddressString,1);

   SET @OktettWert1 = POWER(@Oktett1,4)
   SET @OktettWert2 = POWER(@Oktett2,3)
   SET @OktettWert3 = POWER(@Oktett3,2)
   SET @OktettWert4 = POWER(@Oktett4,1)

   SET @result = @OktettWert1 + @OktettWert2 + @OktettWert3 + @OktettWert4;

return @result;
   
END
Code:
CREATE FUNCTION [dbo].[IPAddressBetween]
(
   @IPAddress Varchar(15),
   @RangeStart VARCHAR(15),
   @RangeEnd VARCHAR(15)
)
RETURNS Bit
AS
BEGIN
  declare @IPValue BIGINT = dbo.IPStringToInt(@IPAddress)
  declare @RangeStartValue BIGINT = dbo.IPStringToInt(@RangeStart)
  declare @RangeEndValue BIGINT = dbo.IPStringToInt(@RangeEnd)

  declare @result BIT

  IF (@IPValue >= @RangeStartValue) AND (@IPValue <= @RangeEndValue)
    set @result = 1
  ELSE
    set @result = 0

  RETURN @result
END
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#9

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 9. Dez 2014, 22:05
Vielen Dank für die ganzen Anregungen und Hilfestellungen. Dann werde ich mich mal ran machen und die beste Lösung für mich versuchen zu finden.
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#10

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 9. Dez 2014, 22:31
Mal ein anderer Ansatz.

Wie wäre es denn am Besten, die IP Adresse in einem MS SQL Server 2008 zu speichern?

Meine App ermittelt die IP Adresse des Rechners im Format xxx.xxx.xxx.xxx (kann auch mal xxx.xx.xxx.xx sein).

Byte (4)? Welchem MS SQL 2008 Datentyp entspricht es?

Wenn ja wie wandelt man denn dann zum Beispiel 172.28.111.29 um? Oder doch lieber ein BigInt?

Vielen Dank im Voraus.

Sven

Geändert von Piro ( 9. Dez 2014 um 22:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz