2011-10-29 14 views
1

ユーザーの(tblUsers)Windows ID(NTID)のテーブルを更新するために使用している現在のプロセスが適切な方法であるかどうかは疑問です。 LDAPは私が信じている1000行だけを返すので、私はそれを1つのクエリですべて実行することができないので、私は疑問に思っています。SQL ServerからLDAPを照会する - ベストプラクティス

tlbUsersには約160,000行があります。私はtblUsersの各レコードのNTIDを更新するLDAPを照会しています。私はLDAPデータを表示するためにADSIにリンクサーバーを使用しています。私のプロセスでは、LDAP(LdapPackage.GetUserNTID)からWindowsIDを取得するストアドプロシージャとtblUsers(LdapPackage.UpdateUserNTID)の行を更新するストアドプロシージャという2つのストアドプロシージャを使用します。

以下のコードはテーブルを更新するためのコードですが、かなり遅いです。これは、LDAPからこのようなバッチ更新を実行したい場合、一度にレコードを更新するよりも簡単な方法があるはずです。

これまでの記事では、UNIONを使用して1000レコードの制限を回避するという興味深い例を示しましたが、各クエリが1000レコード未満を返す場合にのみ有効です。大企業では、それが私の最初の取り組みです。

Querying Active Directory from SQL Server 2005

事前にみんなに感謝します!

<code> 
CREATE PROCEDURE LdapPackage.GetUserNTID 
(
    @EmployeeID INT, 
    @OutNTID VARCHAR(20) OUTPUT 

) 
AS 
BEGIN 

DECLARE @SQLString NVARCHAR(MAX) 
DECLARE @ParmDefinition NVARCHAR(MAX) 
DECLARE @LdapFilter NVARCHAR(100) 
--DECLARE @NTID VARCHAR(20) 

SET @LdapFilter = 'employeeNumber = ' + CAST(@EmployeeID AS NVARCHAR(20)) 

SET @SQLString = 'SELECT DISTINCT @pNTID = samAccountName 
    FROM OPENQUERY(LDAP, 
     ''select samAccountName, Mail 
     from ''''GC://domain.company.com'''' 
     where objectClass=''''user'''' AND objectCategory=''''person'''' and ' + @LdapFilter + ''') 
    WHERE Mail IS NOT NULL' 

SET @ParmDefinition = N'@pNTID varchar(20) OUTPUT' 

EXECUTE sp_executesql 
@SQLString, 
@ParmDefinition, 
@[email protected] OUTPUT 

--SELECT NTID = @OutNTID 

END 
</code> 

<code> 
CREATE PROCEDURE LdapPackage.UpdateUserNTID 
AS 
BEGIN 

    DECLARE @EmployeeID  AS INT 
    DECLARE @NTID  AS VARCHAR(20) 
    DECLARE @RowCount AS INT 
    DECLARE @SQLString AS NVARCHAR(MAX) 
    DECLARE @ParmDefinition AS NVARCHAR(200) 

    SET @RowCount = 1 
    DECLARE Persons CURSOR 
     FOR SELECT DISTINCT EmployeeID FROM tblUsers 

    OPEN Persons 
    FETCH NEXT FROM Persons INTO @EmployeeID 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     --GET NTID 
     SET @SQLString =N'EXEC LdapPackage.GetUserNTID @pEmployeeID, @pNTID OUTPUT' 

     SET @ParmDefinition =N'@pEmployeeID INT, @pNTID VARCHAR(20) OUTPUT' 

     EXECUTE sp_executesql 
      @SQLString, 
      @ParmDefinition, 
      @[email protected], 
      @[email protected] OUTPUT 
     --UPDATE NTID 
     /*PRINT 'RowCount = ' + CAST(@RowCount AS VARCHAR(10)) 
     PRINT 'EmployeeID = ' + CAST(@EmployeeID AS VARCHAR(20)) 
     PRINT 'NTID  = ' + @NTID 
     PRINT '-----------------------------'*/ 
     UPDATE tblUsers 
     SET NTID = @NTID 
     WHERE EmployeeID = @EmployeeID 

     SET @RowCount = @RowCount + 1 
     FETCH NEXT FROM Persons INTO @EmployeeID 
    END 
    CLOSE Persons 
    DEALLOCATE Persons 
END 
</code> 
+0

代わりに、更新するすべてのエントリを含むLDIFファイルを作成することもできます。一度にすべてを更新してください。特に、ディレクトリ内のすべてのエントリを更新していて、ディレクトリに多数のエントリが含まれている場合は、これがおそらく良いでしょう。私のブログエントリ["ldapmodifyの使用"](http://ff1959.wordpress.com/2011/07/25/master-the-ldapmodify-command-line-tool/)を参照してください。 –

+0

これはSQL Serverなどのパッケージとして、または別の場所に作成する必要があるパッケージとして作成できますか? – StoneJedi

+0

Microsoftの全面的な使用方法には、[CLRデータベースオブジェクトの展開](http://msdn.microsoft.com/en-us/library/ms345099(v=SQL.100).aspx)という解決策があります。内部では、ページ検索を使用できるDirectorySearcherを使用することができます。 – JPBlanc

答えて

1

私の解決方法は、システム管理者がLDAPへのレコード制限を増やすことでした。私は、Oracleのようないくつかの種類のSQL Serverインターフェイスを特定したいと思っていたでしょう...将来的にはそうなるかもしれません。

関連する問題