你的错误很常见,但你在本地或使用虚拟机(基础设施即服务,IaaS)解决它的方式与如何解决Windows Azure SQL Database(WASD)的方式不同。 WASD是SQL Server的平台即服务版本。 SQL实例是逻辑的,因此您需要改变一些思维过程。其中一个主要的改变是在如何管理SQL数据库方面。
当您在WASD中创建数据库时,会要求您创建管理用户名和密码。使用该帐户,您可以部署数据库架构以及SQL身份验证用户和权限。您没有更改实例身份验证类型的权限,这就是为什么右键单击实例名称并选择属性时不会看到安全选项的原因。
以下步骤是创建新
LOGIN以允许此新用户对虚拟实例进行身份验证的方法。创建
LOGIN后,您需要为此
LOGIN创建数据库
USER。通过此
USER,您可以分配此
USER可以做和不能做的权限。
添加Windows Azure SQL Database的登录
在我们开始之前,有几点需要注意。在以下代码中,任何尖括号(<和>)中的内容都表示您可以更改的变量。因此,<username>将是您为实体框架应用程序创建的用户名。<password>将是您用于的密码。
使用管理凭据连接到实例。此帐户具有控制数据库所有内容的权限。当您连接时,您应该发现默认情况下已连接到该实例上的主数据库。如果没有,请使用SSMS顶部的下拉菜单更改为master。 "USE master"将无法工作。
从此连接中,以下T-SQL将创建实体框架的用户名和密码。
CREATE LOGIN [<username>] WITH PASSWORD = '<password>';
此时,如果您试图使用此 和 连接到虚拟实例,您只能连接到虚拟实例上的数据库,而无法访问任何数据库。您会看到以下错误信息:
“在当前安全上下文中,服务器主体“”无法访问数据库“”。”
在此用户能够连接到用户数据库之前,您需要再执行至少一步操作。
现在,从同一 SSMS 脚本窗口中,将数据库更改为要授予访问权限的用户数据库()。这将是您希望 Entity-Framework 应用程序使用的数据库。请记住,在顶部使用下拉列表选择。
首先,我们将为上一步创建的登录名创建一个数据库用户。
CREATE USER [<username>] FOR LOGIN <username>
接下来,我们将允许此应用程序连接到您的用户数据库,即您想要Entity-Framework应用程序使用的数据库。
GRANT CONNECT TO [<username>]
现在,您的新用户名可以登录虚拟实例并连接到用户数据库。
现在,您需要添加此用户需要的任何其他权限。例如,如果您的用户只需要读取权限,则可以将该用户添加到db_datareader数据库角色中。现在添加这些权限。
关于连接和连接字符串的特别说明
您的用户现在已设置为连接到用户数据库。这意味着在SSMS中,如果您尝试使用Entity Framework用户进行连接,则连接对话框会多出一步。在单击连接之前,您必须点击“选项”按钮。
![enter image description here](https://istack.dev59.com/JSPLh.webp)
由于您的用户无法访问master,因此您必须告诉SSMS您想先连接到用户数据库并避免访问master。默认情况下,SSMS将首先尝试连接到SQL实例的master数据库。
![enter image description here](https://istack.dev59.com/GeO7U.webp)
您必须在“连接到数据库”条目中输入数据库的名称。输入数据库后,您就可以单击连接了。
我猜测在您的应用程序中,它已经将“Default Catalog=”值设置为您的用户数据库,并且您已经成功连接。在选项中设置此值就像设置“Default Catalog=”值。
希望这可以帮助您更好地了解WASD。
编辑:尝试澄清IaaS SQL Server实例和PaaS Windows Azure SQL Database之间的区别。我之前错过了CREATE USER语句上的FOR LOGIN子句。