我已经创建了一个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中的数据库)。
答案 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