Azure弹性比例碎片键



我正在将数据摩座移动到Azure弹性刻度。

经过一些测试和一些经验,我坠入爱河,这很简单,并且使用这种方法,代码保持干净易于维护。

我只有一个大问题, sharding键在哪里定义?我找不到有关从Visual Studio下载的示例的信息,我可以击败这是一个直截了当的答案。

在Microsoft提供的示例中,默认碎片键是 customerId ,但我找不到对该密钥的引用的位置。

可以在配置文件中的shardmapname中吗?

预先感谢。

SQL模式中的碎片键与其用法(在代码)之间没有明确的链接。

因此,在入门样本中,客户和订单表都包含CustomerId列,并且您可以在dataDaDependententRoutingspample.cs中看到,当我们访问这些表时,我们确保向customerId值提供相同的CC_2值然后在以下查询中使用customerId列(在选择和插入语句中)。

// Looks up the key in the shard map and opens a connection to the shard
using (SqlConnection conn = shardMap.OpenConnectionForKey(customerId, credentialsConnectionString))
{
    // Create a simple command that will insert or update the customer information
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = @"
    IF EXISTS (SELECT 1 FROM Customers WHERE CustomerId = @customerId)
        UPDATE Customers
            SET Name = @name, RegionId = @regionId
            WHERE CustomerId = @customerId
    ELSE
        INSERT INTO Customers (CustomerId, Name, RegionId)
        VALUES (@customerId, @name, @regionId)";
    cmd.Parameters.AddWithValue("@customerId", customerId);
    cmd.Parameters.AddWithValue("@name", name);
    cmd.Parameters.AddWithValue("@regionId", regionId);
    cmd.CommandTimeout = 60;
    // Execute the command
    cmd.ExecuteNonQuery();
}

换句话说,当您在OpenConnectionForKey调用中提供一定的密钥值时,您有责任确保所有具有该连接的SQL查询都仅限于该键值,否则您可能会出现不正确的结果(例如这是一个选择的查询)或生活在错误的碎片上的行(例如,如果是插入查询)。

可以使用新的行级安全功能来解决此安全问题。我们有一个称为"实体框架多租户碎片"的示例,该示例演示了如何将碎片地图与行级安全性结合在一起。相关代码在plasticscalecontext.cs中:

SqlConnection conn = null; 
try 
{ 
    // Ask shard map to broker a validated connection for the given key 
    conn = shardMap.OpenConnectionForKey(shardingKey, connectionStr, ConnectionOptions.Validate); 
    // Set CONTEXT_INFO to shardingKey to enable Row-Level Security filtering 
    SqlCommand cmd = conn.CreateCommand(); 
    cmd.CommandText = @"SET CONTEXT_INFO @shardingKey"; 
    cmd.Parameters.AddWithValue("@shardingKey", shardingKey); 
    cmd.ExecuteNonQuery(); 
    return conn; 
} 
catch (Exception) 
{ 
    if (conn != null) 
    { 
        conn.Dispose(); 
    } 
    throw; 
}

感谢您的好问题!

相关内容

  • 没有找到相关文章

最新更新