Azure SQL数据库缺少属性等

3
我已经到处搜寻,但似乎没有人遇到过我的问题。我最近创建了一个Azure SQL数据库,但一直无法解决错误代码18456的问题。我多次看到"只需右键单击数据库并转到属性和安全性",但是没有找到安全性选项。实际上,当我右键单击时似乎有很多我没有的东西。虽然我对这方面的知识知之甚少,但我尝试了很多方法。有一次我以为我需要使用示例Adventure Works,但那不是解决办法。所以如果有人能帮助我,我会非常感激。
[SSMS版本:16.4.1]
[Azure SQL数据库:服务器版本12]
我的SSMS(SQL Server Management Studio)属性菜单截图: http://prnt.sc/cpwe3c 我的右键单击截图: http://prnt.sc/cpwh7y

那么你究竟想要实现什么——你是在何时收到了那个错误?我认为那是一个身份验证错误。这个链接有助于创建用户吗:https://dev59.com/jGIk5IYBdhLWcg3wp_iM - sgeddes
@sgeddes 嘿,我正在学习这门课程的Entity Framework,当我尝试连接时,它只是显示用户'<username>'的登录失败(我正在尝试更新数据库)。不管怎样,我尝试使用相同凭据创建一个新用户,但却得到了这个 http://prntscr.com/cpwqnc 当我遇到这样的问题时,通常与连接字符串有关,但是我不太懂如何处理这些,尽管我尽力弄清楚,但仍然缺少很多其他人似乎拥有的功能。 - BrianD
所以,我通过复制粘贴来自我的VS服务器资源管理器的连接字符串并编辑密码(我对连接字符串不太了解,但那不是主要问题)成功修复了用户登录失败的问题... 所以,我正在进行一个代码优先工作流的示例,当我创建一个新数据库时,它首先显示超时,但之后很快就创建了,但是我添加的任何新数据库都没有在SSMS的对象资源管理器中显示出来,我一直在刷新,但没有运气。 - BrianD
1
在右键单击数据库时,您将看不到安全选项卡。 - TheGameiswar
请参考下面的完整解释,但要记住,在Windows Azure SQL数据库中,用户帐户是针对用户数据库而不是整个服务器进行范围限定的。想一想,与你在同一个虚拟主机上可能有多少人叫丹尼? - Shannon Lowder
显示剩余2条评论
1个回答

7
你的错误很常见,但你在本地或使用虚拟机(基础设施即服务,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

由于您的用户无法访问master,因此您必须告诉SSMS您想先连接到用户数据库并避免访问master。默认情况下,SSMS将首先尝试连接到SQL实例的master数据库。

enter image description here

您必须在“连接到数据库”条目中输入数据库的名称。输入数据库后,您就可以单击连接了。

我猜测在您的应用程序中,它已经将“Default Catalog=”值设置为您的用户数据库,并且您已经成功连接。在选项中设置此值就像设置“Default Catalog=”值。

希望这可以帮助您更好地了解WASD。

编辑:尝试澄清IaaS SQL Server实例和PaaS Windows Azure SQL Database之间的区别。我之前错过了CREATE USER语句上的FOR LOGIN子句。


对于回复晚了我很抱歉,但是我觉得这个问题不够具体。一开始你告诉我创建一个登录账户,我按照要求做了(虽然我不知道具体目的),然后你说去实际的数据库,当我去了之后,我尝试创建一个用户?但是接下来我要给谁授权连接呢?是同样的用户名吗?还是登录名?我不明白。我尝试了两种方式,但是系统提示我没有权限或者对象不存在。我不确定在"grant connect to"中应该填写什么。什么都不起作用。我不理解。能否用通俗易懂的语言解释一下这到底是什么意思? - BrianD
进一步的回复,我最终通过使用一个叫做"contained user"的东西创建了一个用户。我做了以下操作: CREATE USER user_name WITH PASSWORD = 'Password' ALTER ROLE [db_owner] ADD MEMBER [ContainedUser] 我还执行了下面的操作:ALTER AUTHORIZATION ON SCHEMA::[db_owner] TO [ContainedUser] 但是仍然没有任何效果 :< 我还是无法看到安全性或其他任何内容 - BrianD
我试图为您提供设置新用户安全性的所有步骤。第一步是为新用户设置登录。这一步将允许您的新用户登录到实例中。第二步是为该登录创建一个可以与用户数据库进行交互的数据库用户。让我补充一些细节来更好地解释。 - Shannon Lowder
这些步骤是替代您预期要看到的安全屏幕。 - Shannon Lowder
[ContainedUser]是您尝试为Entity-Framework应用程序创建和使用的<username>吗?如果是的话,请不要使用您上面列出的两个ALTER语句,您只需将该用户添加到角色中:sp_addrolemember 'db_owner','ContainedUser'; - Shannon Lowder
嗨,Shannon,我可以问你一些关于数据库的问题吗?最近我遇到了一些困难,有些事情搞不明白,而你似乎对此很在行。但如果我们通过私信来交流会更方便,而不是在评论区。我猜你应该有电子邮件吧?给我发送电子邮件至smithlydan5@gmail.com - BrianD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接