如何在Azure SQL数据库中与包含的用户一起使用SMO ServerConnection和数据库

问题描述 投票:0回答:1

无法访问master的用户可以使用SMO吗?

我正在通过SMO编写Azure SQL数据库的DLL脚本。我使用了一个具有db_owner角色的包含用户来访问db和DDL,但它引发异常。我创建ServerConnection时,SMO会尝试默认设置为master,对此包含的用户没有权限。

我使用了.net Core 3.0中在nuget和代码上发布的最新SMO版本。

--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遵守ConnectionString中指定的InitialCatalog,而不默认为'master'

azure-sql-database smo
1个回答
0
投票

请参考此官方SMO教程:Connecting to an Instance of SQL Server by Using SQL Server Authentication in Visual Basic

当使用SQL Server身份验证连接到SQL Server实例时,必须指定身份验证类型。此示例演示了声明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

您可以通过更改SMO来使用新的登录名/用户testsqldb连接到testuser。>

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.