Powershell Invoke-Sqlcmd попадает в неправильную базу данных - систему, почему? - PullRequest
1 голос
/ 01 августа 2020

Я развертываю ms sql сервер, брандмауэр, базу данных и sql входы (и другие) через terraform.

Сервер, брандмауэр и база данных развернуты правильно, а вход через 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 ms sql с ms sql. Однако при запуске Invoke-SqlCmd происходит сбой с «База данных« Система »не существует»

ПОЧЕМУ? Боролся с этим уже около 2 дней.

В основном я пытаюсь создать логинов / пользователей с выделенными sql правами (db_read / db_write).

1 Ответ

1 голос
/ 02 августа 2020

Я решил это с помощью одной длинной строки вместо многострочного: Новый код для 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]
}

Все параметры выглядят одинаково, но этот работает. Не знаю, почему ты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...