代码之家  ›  专栏  ›  技术社区  ›  Robert

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

  •  0
  • Robert  · 技术社区  · 7 年前

    首先,我通过TransactionScope打开事务,然后在内部打开两个连接:

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

    第二个连接是到我的用户数据库,我在其中创建用户并将其与先前创建的登录名相关联。

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


    如果在第一次连接时命令用户创建,则会出现以下错误:

    “SomeLogin”不是有效的登录名或您没有权限。不能

    如果我不使用事务,一切都是正常创建的,但我不想这样做,因为在这个操作中创建了大量的东西,我想要事务带来的安全性。

    事务不是立即升级为分布式的吗?我所要达到的目标是否可能?

    编辑:

    这是用于执行这些命令的C代码。using语句初始化数据库上下文,在该上下文中执行的所有操作都获得相同的连接。所以msater上下文指向master数据库,第二个上下文指向用户数据库,但是使用的是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 回复  |  直到 7 年前