Создайте учетную запись сервера и пользователя базы данных в SQL Azure в C # в транзакции - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь создать учетную запись и пользователя базы данных в одной транзакции, но у меня истекает время ожидания.

Сначала я открываю транзакцию через TransactionScope, а внутри открываю два соединения:

Первое подключение - к основной базе данных, где я создаю логин и пользователя для этого имени входа.

CREATE LOGIN [{UserEmail}] WITH PASSWORD='!mjd25MBC'
CREATE USER [{UserEmail}] FOR LOGIN [{UserEmail}]

Второе подключение - к моей базе данных пользователей, где я создаю пользователя и связываю его с ранее созданным именем входа.

CREATE USER [{UserEmail}] FOR LOGIN [{UserEmail}]

У меня истекает время для этой операции.


Если я пропущу создание пользователя при первом подключении, я получу эту ошибку:

'SomeLogin' не является действительным логином или у вас нет разрешения.Невозможно добавить принципала SomeLogin, поскольку он не существует или у вас нет разрешения.

Если я не использую транзакцию, все создается нормально, но я не хочу этого делать, потому чтов этой операции создается много вещей, и мне нужна безопасность, которую обеспечивает транзакция.

Разве транзакция не распространяется сразу же?Возможно ли то, что я пытаюсь достичь?

РЕДАКТИРОВАТЬ:

Это код C #, используемый для выполнения этих команд.Оператор using инициализирует контекст базы данных, и все, что выполняется в этом контексте, получает одно и то же соединение.Таким образом, контекст msater отправляется в основную базу данных, а второй контекст - в пользовательскую базу данных, но с именем входа на сервер, равным admin.

using (var tran = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
    using (var db = Config.DbController().Activate("Master"))
    {
        var query = new StringBuilder();
        query.AppendLine($"CREATE LOGIN [{UserEmail}] WITH PASSWORD='!mjd25MBC'");
        //query.AppendLine($"CREATE USER [{UserEmail}] FOR LOGIN [{UserEmail}]");
        await new SqlUnlimited(query.ToString()).ExecuteScalarAsync();
    }
    using (var db = Config.DbController().Activate("EkonomeoAdmin"))
    {
        var query = new StringBuilder();
        query.AppendLine($"CREATE USER [{UserEmail}] FOR LOGIN [{UserEmail}]");
        if (UserRole == Role.Worker)
            query.AppendLine($"ALTER ROLE [Ekonomeo_Worker] ADD MEMBER [{UserEmail}]");
        else if (UserRole == Role.Client)
            query.AppendLine($"ALTER ROLE [Ekonomeo_Client] ADD MEMBER [{UserEmail}]");

        await new SqlUnlimited(query.ToString()).ExecuteScalarAsync();
    }
    tran.Complete();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...