ユーザーの(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>
代わりに、更新するすべてのエントリを含むLDIFファイルを作成することもできます。一度にすべてを更新してください。特に、ディレクトリ内のすべてのエントリを更新していて、ディレクトリに多数のエントリが含まれている場合は、これがおそらく良いでしょう。私のブログエントリ["ldapmodifyの使用"](http://ff1959.wordpress.com/2011/07/25/master-the-ldapmodify-command-line-tool/)を参照してください。 –
これはSQL Serverなどのパッケージとして、または別の場所に作成する必要があるパッケージとして作成できますか? – StoneJedi
Microsoftの全面的な使用方法には、[CLRデータベースオブジェクトの展開](http://msdn.microsoft.com/en-us/library/ms345099(v=SQL.100).aspx)という解決策があります。内部では、ページ検索を使用できるDirectorySearcherを使用することができます。 – JPBlanc