Зачем мне нужен db_owner, чтобы открыть соединение - PullRequest
0 голосов
/ 03 октября 2018

Я создал базу данных 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

Обновление: Я создаю базу данных, используя несколько сценариев .sql, которые VisualStudio запускает для создания базы данных.Для этого есть следующие (строки с удаленным «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 голосов
/ 03 октября 2018

Во-первых, в качестве фона это сообщение об ошибке является общим сообщением об ошибке подключения, детали которого скрыты от клиента по соображениям безопасности.Вам нужно заглянуть в журналы SQL, чтобы увидеть реальные ошибки.

readwrite является пользователем автономной базы данных, поэтому многие вещи могут потерпеть неудачу.

Сообщение об ошибке входа в систему в журнале SQL будет выглядеть примерно так:

Ошибка входа пользователя 'readwrite'.Причина: не удалось найти логин, соответствующий указанному имени.[КЛИЕНТ: <named pipe>]

, если аутентификация базы данных не настроена, или

Ошибка входа для пользователя «readwrite».Причина: не удалось открыть указанную базу данных.[КЛИЕНТ: <local machine>]

, если имя базы данных неверно, или у пользователя нет разрешения ПОДКЛЮЧИТЬ, или

Не удалось выполнить вход для пользователя «readwrite».Причина: пароль не соответствует предоставленному пользователю.[База данных: 'База данных1'] [КЛИЕНТ: <local machine>]

, если пароль неверный.

В итоге, все следующее должно быть верно для успешного подключения:

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
...