Azure SQL跨订阅异地复制:获取SID正确值遇问题求助
问题解决:Azure SQL跨订阅异地复制中SID的PowerShell转换问题
问题根源
你的脚本存在两个关键问题:
- 笔误导致命令执行失败:第一个
Invoke-Sqlcmd里用了$quer1,正确的变量名是$query1,这会直接导致创建登录名的命令不执行。 - SID转换逻辑错误:
sys.sql_logins返回的sid是二进制字节数组,你直接遍历数组元素转十六进制的方式,会丢失两位补零的格式要求,最终生成的字符串不符合SQL的SID格式(需要0x开头,每个字节用两位十六进制表示)。
修正后的完整脚本
try { $server = "YourServerName" $database = "master" $username = "testadmin" $password = "testpassword" $query1 = "create login geodrsetup with password = 'ComplexPassword01';" $query2 = "create user geodrsetup for login geodrsetup;alter role dbmanager add member geodrsetup;" $query3 = "select sid from sys.sql_logins where name = 'geodrsetup';" # 修正笔误:$quer1改为$query1 Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $query1 -Username $username -Password $password -Verbose Write-Host "Login Added Successfully" Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $query2 -Username $username -Password $password -Verbose Write-Host "User Added Successfully" $result = Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $query3 -Username $username -Password $password -Verbose -As DataTables Write-Host "Get SID value" # 获取二进制SID数组 $sidBytes = $result[0].sid Write-Host "原始SID字节数组: $sidBytes" -ForegroundColor Green # 将字节数组转换为SQL格式的十六进制字符串(0x开头,每个字节两位十六进制) $hexString = "0x" + (-join ($sidBytes | ForEach-Object { "{0:X2}" -f $_ })) # 输出最终格式的SID Write-Output "格式化后的SID: $hexString" } catch { $_.Exception | Format-List -Force }
关键修改说明
- 修复笔误:把
$quer1修正为$query1,确保创建登录名的命令正常执行。 - 正确获取SID字节数组:通过
$result[0].sid直接拿到第一条结果的二进制SID数组(因为查询只会返回一条记录)。 - 标准化十六进制转换:用
"{0:X2}"格式化每个字节,确保单个十六进制数(比如0xA)会补零变成0A,然后用-join拼接所有字节的十六进制字符串,最后加上0x前缀,得到SQL认可的SID格式。 - 避免未初始化变量:直接初始化
$hexString,防止出现空值拼接的问题。
内容的提问来源于stack exchange,提问作者santosh kumar patro
相关产品推荐
相关产品推荐

