我尝试了不同的方法并搜索了很多错误,但到目前为止没有运气。
我正在尝试创建一个可以更新现有分片映射的函数,但是我得到以下异常。
'
虽然我创建了创建分片和删除分片功能但它们工作正常。但是在更新或创建映射时我收到了上述错误。
以下是我的代码:
Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardManagementException: Store Error: Error 515, Level 16, State 2, Procedure __ShardManagement.spBulkOperationShardMappingsLocal, Line 98, Message: Cannot insert the value NULL into column 'LockOwnerId', table 'TEST-POS.__ShardManagement.ShardMappingsLocal'; column does not allow nulls. INSERT fails.
我得到相同的错误,无论是否提供令牌。然后我也尝试以这种方式提供令牌MappingLockToken.Create(),但后来我得到了不同的错误,没有提供正确的令牌。这也很明显,因为令牌不同。
PointMapping<int> pointMapping;
bool mappingExists = _listShardMap.TryGetMappingForKey(9, out pointMapping);
if (mappingExists)
{
var shardLocation = new ShardLocation(NewServerName, NewDatabaseName);
Shard _shard;
bool shardExists =
_listShardMap.TryGetShard(shardLocation, out _shard);
if (shardExists)
{
var token = _listShardMap.GetMappingLockOwner(pointMapping);
var mappingUpdate = new PointMappingUpdate { Shard = _shard, Status = MappingStatus.Online };
var newMapping = _listShardMap.UpdateMapping(_listShardMap.MarkMappingOffline(pointMapping), mappingUpdate, token);
}
}
我还检查了数据库中[__ShardManagement]。[ShardMappingsGlobal]表中的LockOwnerId,这是ID = 00000000-0000-0000-0000-000000000000
我虽然因为令牌Id为零而得到空插入错误,所以我通过执行更新查询手动将其更新到数据库中的451a4da0-e3d4-42ac-bdc3-5b57022693d0。但它不起作用,我得到相同的不能将值NULL插入列'LockOwnerId'错误。
我在创建新映射时也面临同样的Null错误,我在代码中没有看到在创建映射时提供令牌的位置。以下是代码。
_listShardMap.UpdateMapping(offlineMapping, mappingUpdate, MappingLockToken.Create());
Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardManagementException: Mapping referencing shard '[DataSource=cps-pos-test-1.database.windows.net Database=Live_MSA_Test_Cloud]' belonging to shard map 'ClientIDShardMap' is locked and correct lock token is not provided. Error occurred while executing procedure
我在谷歌搜索了很多,并下载了一些示例应用程序,但我无法找到解决方案。我将非常感谢任何帮助。