Azure Elastic Database Merge GUI Key Shards
<p>In Azure we have four Shards and i want to remove two of them as we do not need them anymore. The Data should be merged into the other two Shards.</p>

<p>I use a Listmap with GUIDs as Key to identifiy the Shard (in our application this is the UserId).
In the tutorials i only found samples to merge Shards with the Range type.
Is there a way to merge these type of shards in a faster way or do i have to write my own tool for this?</p>

<p>If the merge is performed automatically what will for example happen in the following case:
The GUID to identify the Shard is the UserId, now this data is moved from Shard A to Shard B. There is another Table called Comments which has the UserId as ForeignKey. The PrimaryKey in this Table is a classic numeric auto increment value. What will happen to those values if they are moved from Shard A to Shard B? Will they be inserted and a new ID is assigned to them or will this not work at all?</p>

<p>Also there is some local FileStorage invloved which uses IDs in the Path so i will have to write my own tool anyway i think.</p>

<p>For that I took a look at the ShardMapManager but did not fully understand how it works. In the ShardMappingsGlobal Table is a Column called MappingId. But this is not the Guid/UserId which is stored in the Shard Database. How do i get the actual Guid which is used to identify the shard, in my case the UserId?
I also did not find Methods to move data between Shards. 
What i would do now is Transfer the Data between the Shards with a tool by myself and then use the ListShardMap.UpdateMapping Method to set a new Shard for the value.
At the end of the operation i would use ListShardMap.DeleteShard or is there a better way to do this?</p>

<p><strong>EDIT:</strong></p>

<p>I wrote my own tool to merge the shards but i get a strange exception now. here some code:</p>

<pre><code>        Guid userKey = Guid.Parse(userId);
        ListShardMap&lt;Guid&gt; map = GetUserShardMap&lt;Guid&gt;();

        try
        {
            PointMapping&lt;Guid&gt; currentMapping = map.GetMappingForKey(userKey);

            PointMapping&lt;Guid&gt; mappingOffline = map.UpdateMapping(currentMapping, new PointMappingUpdate()
            {
                Status = MappingStatus.Offline
            });  
         }
</code></pre>

<p>The UpdateMapping causes the following exception:</p>

<p><strong>Store Error: Error 515, Level 16, State 2, Procedure __ShardManagement.spBulkOperationShardMappingsLocal, Line 98, Message: Cannot insert the value NULL into column 'LockOwnerId', table __ShardManagement.ShardMappingsLocal</strong></p>

<p>I do not understand why there is even an insert? I checked for the mappingId in the local and global Shardmapping tables and the mapping is there so no insert should be required in my opinion. I also took a look at the Code of the mentioned stored procedure spBulkOperationShardMappingsLocal here: <a href="https://github.com/Azure/elastic-db-tools/blob/master/Src/ElasticScale.Client/ShardManagement/Scripts/UpgradeShardMapManagerLocalFrom1.1To1.2.sql" rel="nofollow">https://github.com/Azure/elastic-db-tools/blob/master/Src/ElasticScale.Client/ShardManagement/Scripts/UpgradeShardMapManagerLocalFrom1.1To1.2.sql</a>
In the Insert statement the LockOwnerId is not passed as parameter so it can only fail. 
Currently i work with a testsetup because i do not want to play on the productive system of course. Maybe i made a mistake there but to me everything looks good. i would be very grateful about any hint regarding this error. </p>