在事务中使用C#在Azure SQL中创建服务器登录名和数据库用户

时间:2019-02-10 13:11:51

标签: c# sqlclient azure-sql-server

我正在尝试在同一事务中创建登录名和数据库用户,但超时了。

首先,我通过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();
}

0 个答案:

没有答案
相关问题