私はさまざまな方法を試し、エラーについて多くのグーグル検索を行いましたが、これまでのところ運がありません.
既存のシャード マッピングを更新できる関数を作成しようとしていますが、次の例外が発生します。
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.
Create Shard 関数と Delete Shard 関数を作成しましたが、正常に動作しています。しかし、マッピングの更新中または作成中に上記のエラーが発生します。
以下は私のコードです:
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);
}
}
トークンを提供するかどうかに関係なく、同じエラーが発生します。次に、この方法でトークンを提供しようとしました MappingLockToken.Create() が、正しいトークンが提供されていないという別のエラーが発生します。それもtokenが違うので一目瞭然。
_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
データベースの [__ShardManagement].[ShardMappingsGlobal] テーブルの LockOwnerId も確認しました。これは ID = 00000000-0000-0000-0000-000000000000 です。
トークン ID がゼロであるため、null 挿入エラーが発生していますが、更新クエリを実行して、データベースで手動で 451a4da0-e3d4-42ac-bdc3-5b57022693d0 に更新しました。しかし、それは機能せず、同じ値 NULL を列 'LockOwnerId' エラーに挿入できません。
また、新しいマッピングの作成中に同じ Null エラーに直面しており、マッピングの作成中にトークンを提供する場所がコードに表示されません。以下はコードです。
PointMappingCreationInfo<int> newMappingInfo = new PointMappingCreationInfo<int>(10, newShard, MappingStatus.Online);
var newMapping = _listShardMap.CreatePointMapping(newMappingInfo);
Googleでよく検索し、いくつかのサンプルアプリケーションもダウンロードしましたが、解決策を見つけることができません. どんな種類の助けにも感謝します。