0

さて、Active Directory の Guid によってユーザーを識別する SQL のテーブルがいくつかあります。当初、開発チームはユーザー ベースを sql にミラーリングするだけでよかったのですが、管理者はそれを Active Directory に保持するように主張しました。いずれにせよ、実行しようとしている操作の 1 つは、ユーザーの Guid とその他の情報を含む SQL からテーブルを取得し、それを openquery から AD に生成されているテーブルに結合することです。

問題は、ユーザーが AD から削除されると、開いているクエリが吐き出すことです。存在しない Active Directory のエントリに移動しようとしており、それが実際のクエリではない (基本的にはインデックスである) ため、エラーが発生したためだと思います。これは、ユーザーをプルするために使用している LDAP 文字列です。

LDAP://<GUID=(guid here)>

またはより具体的には、次のようなもの

SELECT * from openquery(ADSI, '
   SELECT displayName, mail
   FROM LDAP://<GUID=(userGuid)>
')

これがインデックスではなくクエリである場合、またはこの場合は「フィルター」である場合、(objectGuid=x) はエラーをスローする代わりに単に結果を返しません。しかし、ここでの問題は、objectGuid が GUID として SQL に返されず、バイナリ 0x102938102938 またはゴミとして返されることです。さて、Guid を 16 進数に変換してから 2 進数に変換し、それを使用して AD にクエリを実行しようと考えましたが、どこから始めればよいかさえわかりません。

したがって、ここでの究極の質問は次のとおりだと思います。GUID が存在しない場合にエラーをスローすることなく、GUID によってユーザーの Active Directory を照会するにはどうすればよいですか? このようにして、それをSQLクエリに結合できますか? これは、.net DirectoryServices ヘルパーを使用するコードではなく、T-SQL で実現できる必要があります。

これが散らかっているように見える場合は申し訳ありませんが、私たちが扱ってきたことをここに掲載したかっただけです. 別のルートを取るための提案を含め、任意の入力を歓迎します。ティア

4

1 に答える 1

2

だからいくつかのこと:

GUID のフォーマットに関しては、CAST(yourColumn as varchar(38)). このリンクでは、動作する形式について説明しています - http://msdn.microsoft.com/en-us/library/windows/desktop/ms677985(v=vs.85).aspx。キャストされた値をフォーマットする方法をSQLに伝えることができるかどうかはわかりません。GUID のフォーマットを行う関数をオンラインで掘り下げる必要があるかもしれません。

テーブル値関数でADルックアップを実行できるかどうかを結合することをお勧めします。そこでエラーをトラップして行を返さないか、行を返してそのように結合できます。

于 2012-06-29T20:20:36.703 に答える