【问题标题】:Powershell Invoke-Sqlcmd hits wrong database - system, why?Powershell Invoke-Sqlcmd 命中错误的数据库 - 系统,为什么?
【发布时间】:2020-11-22 02:19:00
【问题描述】:

我正在通过 terraform 部署 mssql 服务器、防火墙、数据库和 sql 登录(以及更多)。

服务器、防火墙和数据库已正确部署,而通过 powershell 登录失败并出现以下错误:

':退出状态 1。输出:Invoke-Sqlcmd:数据库“系统”没有 存在。确保名称输入正确。

我的 terraform 代码如下所示:

  resource "azurerm_mssql_server" "itan-mssql-server" {
  administrator_login = "itanadmin"
  administrator_login_password = random_password.itan-mssql-admin-password.result
  location = var.location
  name = "itan-mssql-server"
  resource_group_name = var.resource-group-name
  version = "12.0"

  depends_on = [
    azurerm_resource_group.itan-west-europe-resource-group]
}


resource "azurerm_sql_firewall_rule" "itan-mssql-server-firewall-rule" {
  start_ip_address = "${chomp(data.http.myip.body)}"
  end_ip_address = "${chomp(data.http.myip.body)}"
  name = "itan-tf-client-executer-ip"
  resource_group_name = var.resource-group-name
  server_name = azurerm_mssql_server.itan-mssql-server.name
  depends_on = [azurerm_mssql_server.itan-mssql-server]
}

resource "azurerm_mssql_database" "itan-mssql-database" {
  name = "itan"
  server_id = azurerm_mssql_server.itan-mssql-server.id
  sku_name = "basic"
  max_size_gb = "2"

  depends_on = [
    azurerm_mssql_server.itan-mssql-server]
}

resource "null_resource" "itan-mssql-logins" {
  provisioner "local-exec" {
    command =<<EOT

      $server = Get-AzSqlServer
           
      $createReaderLogin = @{
        'ServerInstance' = "${azurerm_mssql_server.itan-mssql-server.fully_qualified_domain_name}"
        'Database' = "itan"
        'Username' = "${azurerm_mssql_server.itan-mssql-server.administrator_login}"
        'Password' = "${random_password.itan-mssql-admin-password.result}"
        'Query' = "SELECT * FROM Students";
      }

      Invoke-Sqlcmd $createReaderLogin

    EOT
    interpreter = ["PowerShell", "-Command"]
  }
  
  depends_on = [azurerm_sql_firewall_rule.itan-mssql-server-firewall-rule]
}

最后一部分,null_resource 被解析成如下内容:

  $server = Get-AzSqlServer

      $createReaderLogin = @{
        'ServerInstance' = "server.database.windows.net"
        'Database' = "database"
        'Username' = "admin"
        'Password' = "***********"
        'Query' = "SELECT * FROM Students";
      }
  • 已经销毁,不用担心密码。
  • 我知道我需要在主数据库上创建登录名并在正确的数据库上创建下一个用户,此选择 * 只是查询失败的一个示例

我已经测试过,在创建服务器、防火墙、数据库之后,我能够将 azure mssql 与 mssql 连接起来。然而,运行 Invoke-SqlCmd 失败并显示 “数据库‘系统’不存在”

为什么?已经为此苦苦挣扎了 2 天。

基本上,我试图创建具有专用 sql 权限 (db_read/db_write) 的登录名/用户。

【问题讨论】:

  • 可能是服务器触发失误?
  • 对不起,我不明白。如何检查?如何使其行为正常?
  • 您之前是否有一个名为 System 的数据库后来被删除了?管理员登录的默认数据库设置是否仍然引用该系统数据库?
  • 不,从来没有。默认情况下,我有主人。接下来我正在创建我的。任何地方都没有提到系统。
  • 您是不是缺少实例名称? server.database.windows.net\MyITANInstanceName 而不仅仅是 server.database.windows.net

标签: sql-server azure powershell terraform azure-sql-server


【解决方案1】:

我用单行而不是多行解决了这个问题: null_resource的新代码

resource "null_resource" "itan-mssql-logins" {
  provisioner "local-exec" {
    command = "Invoke-Sqlcmd -ServerInstance ${azurerm_mssql_server.itan-mssql-server.fully_qualified_domain_name} -Database master -Username itanadmin -Password '${random_password.itan-mssql-admin-password.result}' -Query \"CREATE LOGIN [itanreader] WITH PASSWORD=N'${random_password.itan-mssql-reader-password.result}'\""
    interpreter = ["PowerShell", "-Command"]
  }
  
  depends_on = [azurerm_sql_firewall_rule.itan-mssql-server-firewall-rule, azurerm_mssql_database.itan-mssql-database]
}

所有参数看起来都一样,但这个有效。不知道你为什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-15
    • 2021-12-17
    • 2016-01-15
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多