0

現在、Active Directory ユーザー情報をデータベースにダンプするスクリプトを実行しています。

挿入を行うとき、すべての値を Varbinary(8000) 型の hashcode 列にハッシュします。この列は、変更されたレコードのみを更新するために、次回の実行時にハッシュを比較するために使用されます。現時点では、比較が完了すると、常に異なるものとして返されます。

スクリプトを基本的な例に減らしましたが、それでも同じ問題が発生します。(Enterprise person は、個人情報を保持するデータベース内のローカル テーブルです)

SELECT 
    SamAccountName
INTO
    #TmpEnterprisePerson    
FROM OPENQUERY(ADSI, 'SELECT SamAccountName
              FROM ''LDAP://MyLdapDirectory''
              WHERE SamAccountName = ''myAccount''')

    select HashBytes('MD5',COALESCE(EP.SamAccountName, '') ) as originalHash
        , HashBytes('MD5',COALESCE(T.SamAccountName, '')) as NewHash
        , EP.SamAccountName as originalName
        , T.SamAccountName as newName
        , '"' + EP.SamAccountName + '"' as originalName2
        , '"' + T.SamAccountName + '"' as newName2
        , CAST(COALESCE(EP.SamAccountName, '') AS VARbinary(max)) as oriBinaryName
        , CAST(COALESCE(T.SamAccountName, '') AS VARbinary(max)) as newBinaryName
        , len(ep.samaccountName) as originallength
        , len(T.samaccountName) as newLength
    FROM
        [dbo].[EnterprisePerson] AS EP
        INNER JOIN #TmpEnterprisePerson T ON T.SamAccountName = EP.SamAccountName
where ep.SamAccountName= 'myAccount'


drop table #TmpEnterprisePerson

結果は次のとおりです

OriginalHash = 0xEB4A732C6372E7F1558D4C95E34CE6FF
NewHash      = 0x82DDB9733D5A7532D1C2C734807BE756
OriginalName = MyAccount
NewName      = MyAccount //Same as originalName
OriginalNam2 = "MyAccount"
NewName2     = "MyAccount" //Same as originalName2
oriBinaryName= 0x4C415245415541
newBinaryName= 0x4C00410052004500410055004100
OriginalLen  = 7
NewLength    = 7

ハッシュを比較するときに何が間違っているのか、なぜそれらが異なる結果になるのかわかりません

4

1 に答える 1

1

データ型に問題があると思います。varchar(N) に変換T.SamAccountName- データベースに格納されているものと同じ型 (または、変換よりもキャストしたい場合)。

SELECT 
    SamAccountName
INTO
    #TmpEnterprisePerson    
FROM OPENQUERY(ADSI, 'SELECT SamAccountName
              FROM ''LDAP://MyLdapDirectory''
              WHERE SamAccountName = ''myAccount''')

    select HashBytes('MD5',COALESCE(EP.SamAccountName, '') ) as originalHash
        , HashBytes('MD5', convert(varchar(50), COALESCE(T.SamAccountName), ''))) as NewHash
        , EP.SamAccountName as originalName
        , T.SamAccountName as newName
        , len(ep.samaccountName) as originallength
        , len(T.samaccountName) as newLength
    FROM
        [dbo].[EnterprisePerson] AS EP
        INNER JOIN #TmpEnterprisePerson T ON T.SamAccountName = EP.SamAccountName
where ep.SamAccountName= 'myAccount'


drop table #TmpEnterprisePerson
于 2012-12-06T13:25:03.823 に答える