Как использовать SMO ServerConnection и базу данных с отдельным пользователем в базе данных SQL Azure - PullRequest
0 голосов
/ 03 ноября 2019

Есть ли способ использовать SMO для пользователя, у которого нет доступа к master?

Я пишу DLL библиотеки базы данных SQL Azure через SMO. Я использовал отдельного пользователя с ролью db_owner для доступа к БД и DDL, но он выдает исключение. SMO, как только я создаю ServerConnection, попытается установить значение по умолчанию master, от которого у этого пользователя нет разрешения.

Я использовал последнюю версию SMO, выпущенную для nuget и кода в .NET Core 3.0.

--exec in master db
CREATE LOGIN testuser WITH PASSWORD='...';

--exec in user db: testsqldb
CREATE USER testuser FROM LOGIN testuser
ALTER ROLE db_owner ADD MEMBER testuser

Строка подключения имеет InitialCatalog = testsqldb

var connectionStringBuilder = new SqlConnectionStringBuilder(sourceConnectionString);
var serverConnection = CreateServerConnection(_connectionString);

//this throws exception
var server = new Server(serverConnection);

Сведения об исключении

{"The server principal \"testuser\" is not able to access the database \"master\" under the current security context.\r\nCannot open user default database. Login failed.\r\nLogin failed for user 'testuser'."}

Я ожидаю, что ServerConnection будет соблюдать InitialCatalog, указанный в ConnectionString, а непо умолчанию «мастер»

1 Ответ

0 голосов
/ 05 ноября 2019

Пожалуйста, обратитесь к этому официальному учебному пособию по SMO: Подключение к экземпляру SQL Server с помощью проверки подлинности SQL Server в Visual Basic .

При подключении к экземпляру SQL Server с использованием SQLПроверка подлинности сервера, вы должны указать тип проверки подлинности. В этом примере демонстрируется альтернативный метод объявления переменной объекта ServerConnection, которая позволяет повторно использовать информацию о соединении.

В качестве примера используется код Visual Basic .NET, который демонстрирует, как подключиться к удаленному устройству, а vPassword содержит вход в систему ипароль.

' compile with:   
' /r:Microsoft.SqlServer.Smo.dll  
' /r:Microsoft.SqlServer.ConnectionInfo.dll  
' /r:Microsoft.SqlServer.Management.Sdk.Sfc.dll   

Imports Microsoft.SqlServer.Management.Smo  
Imports Microsoft.SqlServer.Management.Common  

Public Class A  
   Public Shared Sub Main()  
      Dim sqlServerLogin As [String] = "user_id"  
      Dim password As [String] = "pwd"  
      Dim instanceName As [String] = "instance_name"  
      Dim remoteSvrName As [String] = "remote_server_name"  

      ' Connecting to an instance of SQL Server using SQL Server Authentication  
      Dim srv1 As New Server()   ' connects to default instance  
      srv1.ConnectionContext.LoginSecure = False   ' set to true for Windows Authentication  
      srv1.ConnectionContext.Login = sqlServerLogin  
      srv1.ConnectionContext.Password = password  
      Console.WriteLine(srv1.Information.Version)   ' connection is established  

      ' Connecting to a named instance of SQL Server with SQL Server Authentication using ServerConnection  
      Dim srvConn As New ServerConnection()  
      srvConn.ServerInstance = ".\" & instanceName   ' connects to named instance  
      srvConn.LoginSecure = False   ' set to true for Windows Authentication  
      srvConn.Login = sqlServerLogin  
      srvConn.Password = password  
      Dim srv2 As New Server(srvConn)  
      Console.WriteLine(srv2.Information.Version)   ' connection is established  

      ' For remote connection, remote server name / ServerInstance needs to be specified  
      Dim srvConn2 As New ServerConnection(remoteSvrName)  
      srvConn2.LoginSecure = False  
      srvConn2.Login = sqlServerLogin  
      srvConn2.Password = password  
      Dim srv3 As New Server(srvConn2)  
      Console.WriteLine(srv3.Information.Version)   ' connection is established  
   End Sub  
End Class

Вы можете подключиться к testsqldb с помощью нового логина / пользователя testuser, изменив SMO.

Надеюсь, это поможет.

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