通过Powershell连接到Azure SQL DB (PaaS)
$sqlServer = "x.database.windows.net"
$sqlDB = "master"
$conn = new-object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Server=tcp:$($sqlServer),1433;Initial Catalog=$($sqlDB);Persist Security Info=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
$conn.AccessToken = $env:ACCESSTOKEN
$conn.Open()
然后出现错误:
Exception calling "Open" with "0" argument(s): "A connection was successfully established with the server, but then an
error occurred during the login process. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed
by the remote host.)"
At C:Usersxtestcon2.ps1:6 char:1
+ $conn.Open()
+ ~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SqlException
- 我可以通过SSMS直接连接到服务器,没有问题。
- 防火墙规则已设置。
- 最小TLS 1.2
- 资源利用率为零
- 没有其他连接到数据库,除了我的。
- 我已经通过RingBuffer和eventlog在SQL方面,看不到任何错误。
有人知道我如何解决这个问题吗?
我们需要运行install - module Az命令来安装模块
尝试通过运行
验证到AzureConnect-AzAccount
我们可以通过运行下面的命令找到数据库,如果返回你想要连接的数据库,你就可以运行脚本了。
Get-AzSqlServer -ResourceGroupName .
下面的PS脚本将建立连接并执行查询并给出输出。
Import-Module Az.Sql -Force
$rgName = '<Resource Group Name>'
$sqlServer = Get-AzSqlServer -ResourceGroupName $rgName
$sqlDatabase = Get-AzSqlDatabase -ServerName $sqlServer.ServerName -ResourceGroupName $rgName
$Params = @{
'ServerInstance' = $sqlServer.FullyQualifiedDomainName;
'Database' = $sqlDatabase.DatabaseName[0];
'Username' = $sqlServer.SqlAdministratorLogin;
'Password' = ‘<Password>’;
'Query' = 'SQL Statement to access table'
}
Invoke-Sqlcmd @Params
也可参考Microsoft关于使用Powershell进行Azure SQL数据库认证的文章。
此连接问题通常发生在少数位置的服务中,也发生在AccessToken过期时。