Как составить список баз данных на сервере SQL Azure, используя SMO, если не все базы данных используются пользователем для подключения к серверу? - PullRequest
0 голосов
/ 27 ноября 2018

SMO Server.Database выдает исключение, если одна база данных на сервере не имеет пользователя SQL, с которым я использовал для создания соединения с SMO-сервером.

Я не получаю эту ошибкупроисходят при использовании локального экземпляра SQL 2017.

Например:

У меня есть сервер SQL Azure с именем 'myazuresqlserver.database.windows.net'

  1. Создать логин на мастере:

    CREATE LOGIN testlogin WITH PASSWORD = 'ThisIsMySecretPassword'

  2. Создать 2 базы данных , DB1 и DB2.

  3. Создайте пользователя 'testuser' в DB1, но NOT DB2:

    CREATE USER testuserFOR LOGIN testlogin

Затем, используя C # и SMO, я не могу получить список баз данных для этого сервера, используя учетные данные для входа в testlogin - возникает исключение.

static void Main(string[] args)
{
    string[] names = GetDatabaseNames("myazuresqlserver.database.windows.net");
}

public static string[] GetDatabaseNames(string serverName)
{       
    ServerConnection connection = new ServerConnection(serverName, "testuser", "ThisIsMySecretPassword");
    var server = new Server(connection);
    return (from Database database in server.Databases
        where !database.IsSystemObject && !database.IsDatabaseSnapshot
        select database.Name
       ).ToArray();
}

Исключение составляет:

SqlException: The server principal "testlogin" is not able to access the database "DB2" under the current security context.
Cannot open database "DB2" requested by the login. The login failed. Login failed for user 'testlogin'.

Я бы не ожидал, что будет выдано исключение, и вместо этого Server.Database, чтобы содержать только те базы данных, чьи учетные данные были действительными - это похоже на поведение локального экземпляра SQL 2017.

1 Ответ

0 голосов
/ 29 ноября 2018

Я сталкивался с той же проблемой.Это как если бы попытка взглянуть на Server.Database во всех случаях вызывает перечисление, и при этом просматриваются свойства базы данных - свойства, которые пользователь может не иметь разрешения на опрос.Исключение выдается немедленно.

В итоге я использовал другую технику, чтобы получить список баз данных.Я просто запустил SQL-запрос:

SELECT name FROM sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');

Для работы вышеуказанного запроса у пользователя должно быть разрешение на доступ к базе данных master.Вот мой блок кода:

Dim Server As Server = New Server(New ServerConnection("myserver.server.net", "testlogin", "password"))
Dim databaseList As New DataTable
databaseList.Columns.Add("Name")

If Server.Edition = "SQL Azure" Then
    Dim SQLReader As SqlClient.SqlDataReader = Nothing
    Try
        SQLReader = Server.ConnectionContext.ExecuteReader("SELECT name FROM sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');")

        Do While SQLReader.Read = True
            databaseList.Rows.Add(Manager.Database.Sanitise(SQLReader, "name").ToString)
        Loop

        SQLReader.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        If Not SQLReader Is Nothing Then
            SQLReader.Close()
        End If
    End Try
End If
...