Azure SQL 何时准备好接收查询?

When is Azure SQL ready to receive queries?

问题

当我部署 Azure SQL 数据库时,我想在之后立即进行一些查询(在 Azure DevOps 代理上)。有什么办法可以知道它什么时候可以接收查询吗?

正在测试服务器是否 "Ready"

我已尝试在调用数据库之前确保服务器处于 运行ning 状态:

# Looping till server is ready
status="Not Ready"
time=0
while [ "$status" != "Ready" ]
do   
   state=$(az sql server show --resource-group $resourcegroup --name $servername --query state -o tsv)
   echo "Current state is $state"
   sleep 1m
   echo "Have been waiting $time minutes"
   time=$((time + 1))
done

正在测试数据库是否 "Online"

因为这没有用,我决定在数据库级别编写我的 "wait" 语句,并确保它在我进行查询之前在线。

# Looping till database is online
status="Offline"
time=0
while [ "$status" != "Online" ]
do   
   status=$(az sql db show --resource-group $resourcegroup --server $servername --name $databasename --query status -o tsv)
   echo "Current status is $status"
   sleep 1m
   echo "Have been waiting $time minutes"
   time=$((time + 1))
done

这也不起作用,当我第一次使用 sqlcmd 调用时出现错误。但是,如果我等了 5-10 分钟,并且 运行 对新座席进行相同的呼叫,呼叫就会接通。

sqlcmd -U $databaseuser -P $databasepw -S $databasehost -d $databasename -Q "CREATE USER $databaseuser2 FROM LOGIN $databaseuser2"

错误示例:

2019-09-11T08:54:19.6306534Z Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
2019-09-11T08:54:19.6306875Z Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2AF9.
2019-09-11T08:54:19.6308179Z Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..

还需要检查什么?

我看了following post,但是它要求数据库实际接受查询才能进行。

可能的解决方案

虽然 Azure 数据库具有默认设置 允许访问 Azure 服务 = True,但对于 Azure DevOps 代理计算机而言可能并非如此。如果部署数据库,则无法在同一管道中向其发送查询。但是,如果我在第二个管道中发送查询,我 运行 afterworth 它似乎工作。

另一种解决问题的方法是将代理计算机的 IP 添加到防火墙规则中,然后在 运行 宁 SQL 查询后再次删除规则。

# Getting public ip
my_ip=$(curl https://ipinfo.io/ip)

# Creating firewall rule
az sql server firewall-rule create -g $resourcegroup -s $databaseserver -n "agent_access" --start-ip-address $my_ip --end-ip-address $my_ip

# Run cool queries
sqlcmd -U $databaseuser -P $databasepw -S $databasehost -d $databasename -Q "CREATE USER $databaseuser2 FROM LOGIN $databaseuser2" -l 60

# Remove firewall rule
az sql server firewall-rule delete -g $resourcegroup -s $databaseserver -n "agent_access"

注意:我还在 sqlcmd 调用中添加了“-l 60”,因为文档中建议将超时设置为超过 30 秒(默认为 8 秒) ).

感谢@Jim Xu 带领我朝着这个方向前进。