【问题标题】:Why do I need db_owner to open a connection为什么我需要 db_owner 来打开连接
【发布时间】:2019-03-08 20:57:53
【问题描述】:

我创建了一个 Sql Server 数据库(通过 Visual Studio),并在其中创建了一个用户。我赋予该用户 db_datareader 和 db_datawriter 角色的成员资格。

当我尝试打开连接时,出现以下异常。如果我将用户添加到 db_owner 角色,那么它可以工作。为什么? db_datareader 不应该足以打开连接吗?

System.Data.SqlClient.SqlException
  HResult=0x80131904
  Message=A connection was successfully established with the server, but then an error occurred during the login process. (provider: Named Pipes Provider, error: 0 - No process is on the other end of the pipe.)
  Source=.Net SqlClient Data Provider
  StackTrace:
   at LicenseLibrary.Database.AzureDataAccess.<>c__DisplayClass15_0.<ExecuteAction>b__0() in C:\git\Store\LicenseLibrary\Database\AzureDataAccess.cs:line 150

Inner Exception 1:
Win32Exception: No process is on the other end of the pipe

更新: 我正在使用 VisualStudio 运行以创建数据库的许多 .sql 脚本来创建数据库。那些是(删除“GO”的行:

CREATE USER [readwrite] WITH PASSWORD = N'**************';
CREATE USER [readonly] WITH PASSWORD = N'************';
ALTER ROLE [db_datareader] ADD MEMBER [readonly];
ALTER ROLE [db_datareader] ADD MEMBER [readwrite];
ALTER ROLE [db_datawriter] ADD MEMBER [readwrite];

此外,在想要的角色上失败是一个奇怪的例外 - 说没有流程。

我在TestDatabaseRoles.zip 中有一个示例 - 3 行代码即可实现(也需要 zip 中的数据库)。

【问题讨论】:

  • 没有理由需要 db_owner 来连接数据库。你能提供一个简化的复制品吗? stackoverflow.com/help/mcve
  • @DavidBrowne-Microsoft - 已更新。如果您需要任何其他信息,请告诉我。
  • 我无法复制,即使在 localdb 实例上也是如此。你可以为连接代码添加一个repro吗?
  • @DavidBrowne-Microsoft - 我刚刚添加了一个示例链接。该示例只有 3 行代码。我认为您需要数据库才能看到它的发生,因此示例也有。谢谢你看这个!!!

标签: sql-server ado.net roles


【解决方案1】:

首先,作为背景,错误消息是一个通用的连接失败消息,出于安全原因,其详细信息未向客户端提供。您需要查看 SQL 日志以查看真正的错误。

readwrite 是一个包含的数据库用户,所以很多事情都可能失败。

SQL 日志中的登录失败消息类似于:

用户“readwrite”登录失败。原因:找不到登录名 匹配提供的名称。 [客户:&lt;named pipe&gt;]

如果未配置包含的数据库身份验证,或

用户“readwrite”登录失败。原因:无法打开指定的数据库。 [客户:&lt;local machine&gt;]

如果数据库名错误或者用户没有CONNECT权限,或者

用户“readwrite”登录失败。原因:密码与用户提供的密码不匹配。 [数据库:'Database1'] [客户:&lt;local machine&gt;]

如果密码不正确。

总之,连接成功必须满足以下所有条件:

1) 实例必须已启用包含数据库身份验证,并且

exec sp_configure 'contained database authentication', 1;  
GO  
RECONFIGURE ;  

2) 数据库必须设置为partial 遏制。

alter database Database1 set containment = partial

3) 用户必须拥有 CONNECT 权限(db_owner 已经拥有)。

grant connect to readwrite

【讨论】:

  • 首先,谢谢!其次,出于好奇,如果无法连接,用户怎么做?
  • 可以模拟用户并拥有对象而无法连接。
猜你喜欢
  • 2012-09-13
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多