私はデータベース内のネットワークのさまざまな側面のモデリングに取り組んでいます。私たちが扱っているより厄介な問題の1つは、サブネット範囲を作成し、与えられた一連のIPがそれらの範囲内にあるかどうかを判断することです。私たちの現在のモデルは、次の列を持つIPv4とIPv6の違いを占める:サブネット範囲とIPリストを指定すると、IPがすべてのローを選択します
[subnet_sk] [int] IDENTITY(1,1) NOT NULL,
[ipv6_network] [char](39) NULL,
[ipv6_broadcast] [char](39) NULL,
[ipv4_network] [char](15) NULL,
[ipv4_broadcast] [char](15) NULL,
[network_type] [char](4) NOT NULL
上記のスキーマを指摘するために重要であるいくつかの仮定を行います。我々は、記憶と比較のために完全拡張IP(192.168.001.001
対192.168.1.1
)を利用している。 IPv6 addresses numerically in SQL serverの格納に関する問題があるため、この決定を下しました(bigintは、IPv6を表すために6つの列を使用しなければならないという意味の無署名です)。どちらかのタイプのIPはテーブル内の範囲の間にあるかどうかを判断するためにselect文オフ1を書くことは非常に簡単です。このテーブルスキーマを考える
select *
from subnet
where '1234:0000:0000:0000:fc12:00ab:0042:1050'
between ipv6_network
and ipv6_broadcast
-- or alternatively for IPv4
select *
from subnet
where '192.168.005.015'
between ipv4_network
and ipv4_broadcast
IPはサブネット範囲内にあるものを判別します。 IPのリストは、ユーザ入力によって提供され、ではなく、がデータベースに格納されています。明らかに、データベースに格納されているデータについては、以下の例のように同様の結合を行うことができます。
例えば、ユーザは1234:0000:0000:0000:fc12:00ab:0042:1050
,192.168.001.001
および192.168.1.1
を提供することができます。スプリット機能を利用することがハック感じて動作しますが
-- this only covers the IPv4 addresses from the above list a similar query would
-- be used for IPv6 and the two queries could be unioned
select sub.*
from fn_SplitList('192.168.001.001,192.168.005.015',',') split
join subnet sub
on split.Data
between sub.ipv4_network
and sub.ipv4_broadcast
:私が出ている唯一の解決策は、IPアドレスのtable-valued function to split a listを使用しての間で使用して結合を実行することです。私は朝のより良い部分をcommon table expressionsの周りで嗅ぐのに費やしましたが、うまくいくとは思えませんでした。理想的には、単一の選択がIPv4またはIPv6列から特定の文字列をバウンスするかどうかを決定しますが、不可能な場合は、IPの集合をデータベースに渡す前にリストを分割できます。
私は上記のうちSQL Fiddleを作成しました。それらのIPがどの既存のサブネット範囲にあるかを判断するために、IPのリストが与えられていると、SQLにメカニズムがありますか(T-SQLを使用したくないですか?)上記のスキーマは、問題の適切なアプローチでさえ、別のデータモデルがより簡単なソリューションにつながるでしょうか?
私は良いネットワークの知識を持っていません。私が知りたいのは、あなたを悩ませているfn_SplitList()だけであるか、シナリオ全体を処理するためのよりよい方法を探したいのですか? –
@RaviSinghこのデータモデルでは、日付のリストを使用していて、範囲内に収まっているかどうかを判断しようとするのと同じ質問が出ます。ですから、私の問題は、fn_SplitListが問題を回避する方法だと感じていますが、そこにはもっとクリーンなソリューションがあるように感じます。それは、あなたのスキーマが間違っていて、あなたのデータモデルがこのように設定されていれば、クエリが簡単になると言ってくれれば、私はすべての耳になるだろう。したがって、モデリングを手助けすることはできませんが、fn_SplitListを使用しないより良いクエリを手助けすることができれば、私はあなたのソリューションに非常に興味があります。 – ahsteele
これに遅れましたが、ここではSQL Serverの文字列分割について論じるいくつかの類似スレッドがあります:http://stackoverflow.com/questions/2647/split-string-in-sql and http://stackoverflow.com/質問/ 314824/t-sql-反対の - 文字列 - 連結の方法 - 分割 - 文字列 - 複数の - recoへ – rutter