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