为什么需要db_owner打开连接

时间:2018-10-03 15:11:02

标签: sql-server ado.net roles

我已经创建了一个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];

enter image description here

此外,由于没有想要的角色而导致的失败,这是一个奇怪的例外-说没有流程。

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

1 个答案:

答案 0 :(得分:1)

首先,作为背景,错误消息是一般的连接失败消息,出于安全原因,其详细信息将从客户端保留。您需要查看SQL日志以查看实际错误。

while($user = mysqli_fetch_array($result, MYSQLI_ASSOC)) { $lima[] = $user['identification']; } 是一个包含的数据库用户,因此很多事情可能会失败。

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

  

用户'readwrite'登录失败。原因:找不到登录名   匹配提供的名称。 [客户:readwrite]

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

  

用户'readwrite'登录失败。原因:无法打开指定的数据库。 [客户:<named pipe>]

如果数据库名称错误或用户缺乏CONNECT权限,或者

  

用户'readwrite'登录失败。原因:密码与所提供用户的密码不匹配。 [数据库:'Database1'] [客户:<local machine>]

如果密码不正确。

总而言之,以下所有条件都必须为真才能使连接成功:

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

<local machine>

2)必须将数据库设置为exec sp_configure 'contained database authentication', 1; GO RECONFIGURE ; 容纳。

partial

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

alter database Database1 set containment = partial