Mam dużą listę podsieci w sieci przechowywane w następującym układzie. Jest to używane jako tabela główna do przechowywania zasobów, które będą używane do automatycznego sprawdzania statusu przez skrypt w języku Python w regularnych odstępach czasu.Rozszerzenie cidr PostgreSQL na indywidualne adresy
CREATE TEMP TABLE tmp_networks (
network cidr PRIMARY KEY
);
Załóżmy jego wypełniona tych wartości dla dobra demonstracji:
- 10.0.0.0/8
- 10.0.1.0/24
- 192.168.0.0/24
Po uruchomieniu skryptu skrypt Python wykona następujące zapytanie, aby usunąć wszystkie nakładki:
SELECT network
FROM tmp_networks
WHERE NOT EXISTS (
SELECT network
FROM tmp_networks n
WHERE n.network >> tmp_networks.network
);
Działa to świetnie, z wyjątkiem jednego małego problemu; Mam również listę indywidualnych adresów, które powinny być wykluczone z pracy. Jest to również tabela w bazie danych:
CREATE TEMP TABLE tmp_except (
address inet PRIMARY KEY
);
Załóżmy ten zawiera następujące adresy:
- 10.0.0.100
- 192.168.0.10
Teraz Zawiodłem znaleźć dobrą metodę usuwania tych spesywnych adresów z danych wyjściowych bazy danych. W moich myślach, rozwiązaniem byłoby coś jak:
- zaznaczyć wszystkie podsieci
- jeśli adres wyjątek znajduje się w podsieci, podzielić podsieć na mniejsze kawałki, aż pojedynczy adres Wyjątkiem mogą być usunięte i wszystkie inne adresy pozostają
Próbowałem sprawdzić, czy coś takiego można zrobić w czystym PostgreSQL, ale nie udało się znaleźć żadnego rozwiązania. Jakieś wskazówki, jak to rozwiązać?
Jaki jest wynik, którego oczekujesz od zapytania? Czy zawsze jest * adresy (/ 32) * czy jest to * adresy sieciowe, jeśli to możliwe, i tylko adresy, jeśli istnieje wyjątek *? – Beryllium
Witam, oprócz adresów sieciowych, jeśli to możliwe OR/32, jeśli nie ma większych bloków. – agnsaft