Sdílet prostřednictvím


Hierarchické klíče oddílů ve službě Azure Cosmos DB

PLATÍ PRO: NoSQL

Azure Cosmos DB distribuuje vaše data mezi logické a fyzické oddíly na základě klíčů oddílů, aby podporovala horizontální škálování. Pomocí hierarchických klíčů oddílů (označovaných také jako dílčí dělení) můžete pro klíče oddílů nakonfigurovat až tříúrovňovou hierarchii, abyste mohli dále optimalizovat distribuci dat a vyšší úroveň škálování.

Pokud dnes používáte syntetické klíče, máte scénáře, ve kterých klíče oddílů můžou překročit 20 GB dat, nebo byste chtěli zajistit, aby se dokument každého tenanta mapoval na vlastní logický oddíl, může pomoct dílčí dělení. Pokud použijete tuto funkci, můžou předpony klíče logického oddílu překročit 20 GB a 10 000 jednotek žádostí za sekundu (RU/s). Dotazy podle předpony se efektivně směrují na podmnožinu oddílů, které obsahují data.

Výběr hierarchických klíčů oddílů

Pokud máte víceklientských aplikací a aktuálně izolujete tenanty podle klíče oddílu, můžou pro vás být užitečné hierarchické oddíly. Hierarchické oddíly umožňují škálovat nad rámec limitu logického klíče oddílu 20 GB a jsou dobrým řešením, pokud chcete zajistit, aby se dokumenty jednotlivých tenantů mohly škálovat neomezeně. Pokud váš aktuální klíč oddílu nebo pokud jeden klíč oddílu často dosahuje 20 GB, jsou hierarchické oddíly pro vaši úlohu skvělou volbou.

V závislosti na povaze vaší úlohy a na tom, jak kardinaliuje klíč první úrovně, ale může existovat určité kompromisy, které podrobně probereme na stránce s hierarchickými scénáři oddílů.

Když zvolíte každou úroveň hierarchického klíče oddílu, je důležité mít na paměti následující obecné koncepty dělení a porozumět tomu, jak každý z nich může ovlivnit vaše úlohy:

  • Pro všechny kontejnery by každá úroveň úplné cesty (počínaje první úrovní) vašeho hierarchického klíče oddílu měla:

    • Mají vysokou kardinalitu. První, druhý a třetí (pokud je k dispozici) klíčů hierarchického oddílu by měly mít širokou škálu možných hodnot.

      • Nízká kardinalita na první úrovni hierarchického klíče oddílu omezí všechny operace zápisu v době příjmu dat pouze na jeden fyzický oddíl, dokud nedosáhne 50 GB a rozdělí se do dvou fyzických oddílů. Předpokládejme například, že klíč první úrovně je zapnutý TenantId a má pouze 5 jedinečných tenantů. Každá z těchto operací tenantů bude omezena pouze na jeden fyzický oddíl, což omezí spotřebu propustnosti jenom na to, co je v daném fyzickém oddílu. Důvodem je to, že hierarchické oddíly optimalizují pro všechny dokumenty se stejným klíčem první úrovně, který se má sloučit do stejného fyzického oddílu, aby nedocházelo k úplným dotazům.
      • I když to může být v pořádku u úloh, kdy jednorázově ingestujeme všechna data našich tenantů a následující operace jsou následně primárně náročné na čtení, může to být pro úlohy, u kterých vaše obchodní požadavky zahrnují příjem dat v určitém čase. Pokud máte například přísné obchodní požadavky, aby se zabránilo latencím, maximální propustnost, kterou vaše úloha může teoreticky dosáhnout ingestování dat, je počet fyzických oddílů × 10 tisíc. Pokud má klíč nejvyšší úrovně nízkou kardinalitu, bude váš počet fyzických oddílů pravděpodobně 1, pokud pro klíč úrovně 1 není dostatek dat, aby se po rozdělení rozložil mezi více oddílů, což může trvat 4 až 6 hodin.
    • Rovnoměrně rozprostřete spotřebu jednotek žádostí (RU) a úložiště dat napříč všemi logickými oddíly. Toto rozložení zajišťuje rovnoměrnou spotřebu RU a distribuci úložiště napříč fyzickými oddíly.

      • Pokud zvolíte klíč první úrovně, který vypadá jako vysoká kardinalita UserId, ale v praxi vaše úlohy provádí operace pouze na jednom konkrétním UserIdoddílu , pak pravděpodobně narazíte na horký oddíl, protože všechny operace budou vymezeny pouze na jeden nebo několik fyzických oddílů.
  • Úlohy náročné na čtení: Doporučujeme zvolit hierarchické klíče oddílů, které se často zobrazují v dotazech.

    • Například úloha, která často spouští dotazy, které vyfiltrují konkrétní uživatelské relace ve víceklientských aplikacích, můžou těžit z hierarchických klíčů oddílů , TenantIdUserIda SessionIdv tomto pořadí. Dotazy lze efektivně směrovat pouze na relevantní fyzické oddíly zahrnutím klíče oddílu do predikátu filtru. Další informace o výběru klíčů oddílů pro úlohy náročné na čtení najdete v přehledu dělení.
  • Úlohy náročné na zápis: Pro klíč hierarchického oddílu doporučujeme použít vysokou mohutnou hodnotu. Vysoká kardinalita znamená, že klíč první úrovně (a další úrovně) má alespoň tisíce jedinečných hodnot a více jedinečných hodnot než počet fyzických oddílů.

    • Předpokládejme například, že máme úlohu, která izoluje tenanty podle klíče oddílu a má několik velkých tenantů, které jsou náročnější na zápis než jiné. Azure Cosmos DB dnes přestane ingestovat data na libovolnou hodnotu klíče oddílu, pokud překročí 20 GB dat. V této úloze jsou Microsoft a Contoso velkými tenanty a předpokládáme, že roste mnohem rychleji než ostatní tenanti. Aby se zabránilo riziku, že nebude možné ingestovat data pro tyto tenanty, hierarchické klíče oddílů nám umožňují škálovat tyto tenanty nad rámec limitu 20 GB. Můžeme přidat další úrovně, jako je UserId a SessionId, abychom zajistili vyšší škálovatelnost napříč tenanty.

    • Pokud chcete zajistit, aby vaše úloha vyhovovala zápisům pro všechny dokumenty se stejným klíčem první úrovně, zvažte použití ID položky jako klíče druhé nebo třetí úrovně.

    • Pokud vaše první úroveň nemá vysokou kardinalitu a v současné chvíli dosáhnete limitu 20 GB logického oddílu pro klíč oddílu, doporučujeme místo hierarchického klíče oddílu použít syntetický klíč oddílu.

Příklad případu použití

Předpokládejme, že máte scénář s více tenanty, ve kterém ukládáte informace o událostech pro uživatele v každém tenantovi. Informace o události můžou obsahovat výskyty událostí, mimo jiné také přihlášení, clickstream nebo platební události.

V reálném scénáři můžou někteří tenanti růst s tisíci uživatelů, zatímco mnoho dalších tenantů je menší a má několik uživatelů. Dělení podle /TenantId může vést k překročení limitu úložiště Azure Cosmos DB 20 GB na jednom logickém oddílu. Dělení provede /UserId všechny dotazy v tenantovi mezi oddíly. Oba přístupy mají významné nevýhody.

Použití syntetického klíče oddílu, který kombinuje TenantId a UserId přidává složitost aplikace. Dotazy na syntetické klíče oddílu pro tenanta jsou navíc stále rozdělené mezi oddíly, pokud nejsou všichni uživatelé známi a nezadávají se předem.

Pokud má vaše úloha tenanty se zhruba stejnými vzory úloh, může vám pomoct hierarchický klíč oddílu. Pomocí hierarchických klíčů oddílů můžete nejprve rozdělit oddíl na TenantIda pak na UserId. Pokud očekáváte, že TenantId a UserId kombinace vytvoří oddíly, které překračují 20 GB, můžete dokonce dále rozdělit na jinou úroveň, například na SessionId. Celková hloubka nesmí překročit tři úrovně. Když fyzický oddíl překročí 50 GB úložiště, Azure Cosmos DB automaticky rozdělí fyzický oddíl tak, aby přibližně polovina dat byla na jednom fyzickém oddílu a polovina je na druhém. V podstatě subpartitioning znamená, že jedna TenantId hodnota může překročit 20 GB dat a je možné TenantId , aby data překračovala více fyzických oddílů.

Dotazy, které určují buď TenantId( nebo obě TenantId a UserId) jsou efektivně směrovány pouze na podmnožinu fyzických oddílů, které obsahují relevantní data. Když zadáte úplnou cestu klíče oddílu nebo předpony s dílčími oddíly, vyhnete se tak úplnému dotazu na ventilátor. Pokud by například kontejner měl 1 000 fyzických oddílů, ale konkrétní TenantId hodnota byla pouze na 5 fyzických oddílech, dotaz by se směroval na menší počet relevantních fyzických oddílů.

Použití ID položky v hierarchii

Pokud má váš kontejner vlastnost, která má velký rozsah možných hodnot, je pravděpodobně skvělou volbou klíče oddílu pro poslední úroveň vaší hierarchie. Jedním z možných příkladů tohoto typu vlastnosti je ID položky. ID položky systémové vlastnosti existuje v každé položce v kontejneru. Přidání ID položky jako další úrovně zaručuje, že můžete škálovat nad rámec limitu klíče logického oddílu o velikosti 20 GB. Můžete škálovat nad rámec tohoto limitu pro první úroveň nebo pro první a druhou úroveň klíčů.

Můžete mít například kontejner pro víceklientskou úlohu rozdělenou podle TenantId a UserId. Pokud je možné použít jednu kombinaci TenantId a UserId překročit 20 GB, doporučujeme rozdělit oddíly pomocí tří úrovní klíčů, ve kterých má klíč třetí úrovně vysokou kardinalitu. Příkladem tohoto scénáře je, že klíč třetí úrovně je identifikátor GUID, který má přirozeně vysokou kardinalitu. Je nepravděpodobné, že kombinace TenantId, UserIda IDENTIFIKÁTOR GUID překračuje 20 GB, takže kombinace TenantId a UserId může efektivně škálovat nad 20 GB.

Další informace o použití ID položky jako klíče oddílu najdete v přehledu dělení.

Začínáme

Důležité

Práce s kontejnery, které používají hierarchické klíče oddílů, je podporována pouze v následujících verzích sady SDK. Podporovanou sadu SDK musíte použít k vytvoření nových kontejnerů s hierarchickými klíči oddílu a k provádění operací vytváření, čtení, aktualizace a odstraňování (CRUD) nebo dotazování na data. Pokud chcete použít sadu SDK nebo konektor, který se v současné době nepodporuje, vytvořte žádost na našem komunitním fóru.

Vyhledejte nejnovější verzi Preview každé podporované sady SDK:

Sada SDK Podporované verze Odkaz správce balíčků
Sada .NET SDK v3 >= 3,33,0 https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.33.0/
Sada Java SDK v4 >= 4,42,0 https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/cosmos/azure-cosmos/CHANGELOG.md#4420-2023-03-17/
JavaScript SDK v4 4.0.0 https://www.npmjs.com/package/@azure/cosmos/
Python SDK >= 4.6.0 https://pypi.org/project/azure-cosmos/4.6.0/

Vytvoření kontejneru pomocí hierarchických klíčů oddílů

Začněte vytvořením nového kontejneru pomocí předdefinovaného seznamu cest klíčů dílčích oddílů až do tří úrovní hloubky.

Nový kontejner můžete vytvořit pomocí jedné z těchto možností:

  • portál Azure
  • Sada SDK
  • Šablona Azure Resource Manageru
  • Emulátor služby Azure Cosmos DB

portál Azure

Nejjednodušší způsob, jak vytvořit kontejner a zadat hierarchické klíče oddílů, je použití webu Azure Portal.

  1. Přihlaste se k portálu Azure.

  2. Přejděte na existující stránku účtu Azure Cosmos DB for NoSQL.

  3. V nabídce vlevo vyberte Průzkumník dat.

    Snímek obrazovky znázorňující stránku nového účtu Azure Cosmos DB for NoSQL se zvýrazněnou možností nabídky Průzkumník dat

  4. V Průzkumníku dat vyberte možnost Nový kontejner.

    Snímek obrazovky s možností Nový kontejner v Průzkumníku dat

  5. V novém kontejneru zadejte jako klíč oddílu /TenantId. U zbývajících polí zadejte libovolnou hodnotu, která odpovídá vašemu scénáři.

    Poznámka:

    Jako příklad zde použijeme /TenantId . Při implementaci hierarchických klíčů oddílů do vlastních kontejnerů můžete zadat libovolný klíč pro první úroveň.

  6. Dvakrát vyberte Přidat hierarchický klíč oddílu.

    Snímek obrazovky s tlačítkem pro přidání nového hierarchického klíče oddílu

  7. Pro druhou a třetí úroveň dílčího dělení zadejte /UserId a /SessionId v uvedeném pořadí.

    Snímek obrazovky se seznamem tří hierarchických klíčů oddílů

  8. Tlačítkem OK vytvořte kontejner.

Sada SDK

Při vytváření nového kontejneru pomocí sady SDK definujte seznam cest klíčů dílčích oddílů až do tří úrovní hloubky. Seznam klíčů dílčích oddílů použijte při konfiguraci vlastností nového kontejneru.

// List of partition keys, in hierarchical order. You can have up to three levels of keys.
List<string> subpartitionKeyPaths = new List<string> { 
    "/TenantId",
    "/UserId",
    "/SessionId"
};

// Create a container properties object
ContainerProperties containerProperties = new ContainerProperties(
    id: "<container-name>",
    partitionKeyPaths: subpartitionKeyPaths
);

// Create a container that's subpartitioned by TenantId > UserId > SessionId
Container container = await database.CreateContainerIfNotExistsAsync(containerProperties, throughput: 400);

Šablony Azure Resource Manageru

Šablona Azure Resource Manageru pro kontejner s dílčími oddíly je téměř identická se standardním kontejnerem. Jediným klíčovým rozdílem je hodnota properties/partitionKey cesty. Další informace o vytvoření šablony Azure Resource Manageru pro prostředek Azure Cosmos DB najdete v referenčních informacích k šabloně Azure Resource Manageru pro službu Azure Cosmos DB.

partitionKey Nakonfigurujte objekt pomocí hodnot v následující tabulce a vytvořte tak kontejner s dílčími oddíly:

Cesta Hodnota
paths Seznam hierarchických klíčů oddílů (maximální tři úrovně hloubky)
kind MultiHash
version 2

Příklad definice klíče oddílu

Předpokládejme například, že máte hierarchický klíč oddílu, který se skládá z TenantIdSessionId>UserId>. Objekt partitionKey by byl nakonfigurován tak, aby zahrnoval všechny tři hodnoty ve paths vlastnosti, kind hodnotu MultiHasha version hodnotu 2.

partitionKey: {
  paths: [
    '/TenantId'
    '/UserId'
    '/SessionId'
  ]
  kind: 'MultiHash'
  version: 2
}

Další informace o objektu partitionKey naleznete ve specifikaci ContainerPartitionKey.

Emulátor služby Azure Cosmos DB

Funkci dílčího dělení můžete otestovat pomocí nejnovější verze místního emulátoru služby Azure Cosmos DB. Pokud chcete povolit podparitioning v emulátoru, spusťte emulátor z instalačního adresáře s příznakem /EnablePreview :

.\CosmosDB.Emulator.exe /EnablePreview

Upozorňující

Emulátor v současné době nepodporuje všechny funkce klíče hiearchického oddílu jako portál. Emulátor v současné době nepodporuje:

  • Použití Průzkumníka dat k vytvoření kontejnerů s hierarchickými klíči oddílů
  • Použití Průzkumníka dat k přechodu na položky a interakci s nimi pomocí hierarchických klíčů oddílů

Další informace najdete v tématu Emulátor služby Azure Cosmos DB.

Použití sad SDK pro práci s kontejnery, které mají hierarchické klíče oddílů

Pokud máte kontejner s hierarchickými klíči oddílů, použijte dříve zadané verze sad .NET nebo Sad Java SDK k provádění operací a spouštění dotazů v tomto kontejneru.

Přidání položky do kontejneru

Existují dvě možnosti přidání nové položky do kontejneru s povolenými hierarchickými klíči oddílů:

  • Automatická extrakce
  • Ruční zadání cesty

Automatická extrakce

Pokud předáte objekt se sadou hodnot klíče oddílu, sada SDK může automaticky extrahovat úplnou cestu klíče oddílu.

// Create a new item
UserSession item = new UserSession()
{
    id = "f7da01b0-090b-41d2-8416-dacae09fbb4a",
    TenantId = "Microsoft",
    UserId = "8411f20f-be3e-416a-a3e7-dcd5a3c1f28b",
    SessionId = "0000-11-0000-1111"
};

// Pass in the object, and the SDK automatically extracts the full partition key path
ItemResponse<UserSession> createResponse = await container.CreateItemAsync(item);

Ruční zadání cesty

Třída PartitionKeyBuilder v sadě SDK může vytvořit hodnotu pro dříve definovanou hierarchickou cestu klíče oddílu. Tuto třídu použijte, když přidáte novou položku do kontejneru, který má povolenou dílčí dělení.

Tip

Ve velkém měřítku může být výkon vylepšen, pokud zadáte úplnou cestu klíče oddílu, i když sada SDK dokáže extrahovat cestu z objektu.

// Create a new item object
PaymentEvent item = new PaymentEvent()
{
    id = Guid.NewGuid().ToString(),
    TenantId = "Microsoft",
    UserId = "8411f20f-be3e-416a-a3e7-dcd5a3c1f28b",
    SessionId = "0000-11-0000-1111"
};

// Specify the full partition key path when creating the item
PartitionKey partitionKey = new PartitionKeyBuilder()
            .Add(item.TenantId)
            .Add(item.UserId)
            .Add(item.SessionId)
            .Build();

// Create the item in the container
ItemResponse<PaymentEvent> createResponse = await container.CreateItemAsync(item, partitionKey);

Vyhledání položky typu klíč/hodnota (čtení bodu)

Vyhledávání klíč/hodnota (čtení bodů) se provádí způsobem, který se podobá kontejneru, který není součástí oddílu. Předpokládejme například, že máte hierarchický klíč oddílu, který se skládá z TenantIdSessionId>UserId>. Jedinečný identifikátor položky je identifikátor GUID. Představuje se jako řetězec, který slouží jako jedinečný identifikátor transakce dokumentu. Chcete-li provést čtení bodu u jedné položky, předejte id vlastnost položky a úplnou hodnotu klíče oddílu, včetně všech tří součástí cesty.

// Store the unique identifier
string id = "f7da01b0-090b-41d2-8416-dacae09fbb4a";

// Build the full partition key path
PartitionKey partitionKey = new PartitionKeyBuilder()
    .Add("Microsoft") //TenantId
    .Add("8411f20f-be3e-416a-a3e7-dcd5a3c1f28b") //UserId
    .Add("0000-11-0000-1111") //SessionId
    .Build();

// Perform a point read
ItemResponse<UserSession> readResponse = await container.ReadItemAsync<UserSession>(
    id,
    partitionKey
);

Spuštění dotazu

Kód sady SDK, který používáte ke spuštění dotazu v kontejneru s dílčími oddíly, je stejný jako spuštění dotazu v kontejneru, který není součástí.

Když dotaz určuje všechny hodnoty klíčů oddílů ve WHERE filtru nebo v předponě hierarchie klíčů, sada SDK automaticky směruje dotaz do odpovídajících fyzických oddílů. Dotazy, které poskytují pouze "střední" hierarchii, jsou dotazy napříč oddíly.

Představte si například hierarchický klíč oddílu, který se skládá z TenantId>>UserIdSessionId. Komponenty filtru dotazu určují, jestli se jedná o dotaz s jedním oddílem, cílový dotaz napříč oddíly nebo dotaz s ventilátorem.

Dotaz Směrování
SELECT * FROM c WHERE c.TenantId = 'Microsoft' AND c.UserId = '8411f20f-be3e-416a-a3e7-dcd5a3c1f28b' AND c.SessionId = '0000-11-0000-1111' Směrováno do jednoho logického a fyzického oddílu, který obsahuje data pro zadané hodnoty , TenantIdUserIda SessionId.
SELECT * FROM c WHERE c.TenantId = 'Microsoft' AND c.UserId = '8411f20f-be3e-416a-a3e7-dcd5a3c1f28b' Směrováno pouze na cílovou podmnožinu logických a fyzických oddílů , které obsahují data pro zadané hodnoty TenantId a UserId. Tento dotaz je cílový dotaz napříč oddíly, který vrací data pro konkrétního uživatele v tenantovi.
SELECT * FROM c WHERE c.TenantId = 'Microsoft' Směrováno pouze na cílovou podmnožinu logických a fyzických oddílů , které obsahují data pro zadanou hodnotu TenantId. Tento dotaz je cílový dotaz napříč oddíly, který vrací data pro všechny uživatele v tenantovi.
SELECT * FROM c WHERE c.UserId = '8411f20f-be3e-416a-a3e7-dcd5a3c1f28b' Směrováno na všechny fyzické oddíly, což vede k dotazování mezi oddíly ventilátoru.
SELECT * FROM c WHERE c.SessionId = '0000-11-0000-1111' Směrováno na všechny fyzické oddíly, což vede k dotazování mezi oddíly ventilátoru.

Dotaz na jeden oddíl v kontejneru s dílčími oddíly

Tady je příklad spuštění dotazu, který zahrnuje všechny úrovně dílčích oddílů, čímž se dotaz efektivně vytvoří jako dotaz s jedním oddílem.

// Define a single-partition query that specifies the full partition key path
QueryDefinition query = new QueryDefinition(
    "SELECT * FROM c WHERE c.TenantId = @tenant-id AND c.UserId = @user-id AND c.SessionId = @session-id")
    .WithParameter("@tenant-id", "Microsoft")
    .WithParameter("@user-id", "8411f20f-be3e-416a-a3e7-dcd5a3c1f28b")
    .WithParameter("@session-id", "0000-11-0000-1111");

// Retrieve an iterator for the result set
using FeedIterator<PaymentEvent> results = container.GetItemQueryIterator<PaymentEvent>(query);

while (results.HasMoreResults)
{
    FeedResponse<UserSession> resultsPage = await resultSet.ReadNextAsync();
    foreach(UserSession result in resultsPage)
    {
        // Process result
    }
}

Cílený dotaz na více oddílů v kontejneru s dílčími oddíly

Tady je příklad dotazu, který obsahuje podmnožinu úrovní dílčích oddílů, čímž tento dotaz efektivně vytvoří cílový dotaz s více oddíly.

// Define a targeted cross-partition query specifying prefix path[s]
QueryDefinition query = new QueryDefinition(
    "SELECT * FROM c WHERE c.TenantId = @tenant-id")
    .WithParameter("@tenant-id", "Microsoft")

// Retrieve an iterator for the result set
using FeedIterator<PaymentEvent> results = container.GetItemQueryIterator<PaymentEvent>(query);

while (results.HasMoreResults)
{
    FeedResponse<UserSession> resultsPage = await resultSet.ReadNextAsync();
    foreach(UserSession result in resultsPage)
    {
        // Process result
    }
}

Omezení a známé problémy

  • Práce s kontejnery, které používají hierarchické klíče oddílů, se podporuje pouze v sadě .NET v3 SDK, v sadě Java SDK v4, v sadě Python SDK a ve verzi Preview sady JavaScript SDK. K vytvoření nových kontejnerů s hierarchickými klíči oddílů a provádění operací CRUD nebo dotazování na data musíte použít podporovanou sadu SDK. Podpora jiných sad SDK, včetně Pythonu, není momentálně dostupná.
  • Existují omezení různých konektorů služby Azure Cosmos DB (například u služby Azure Data Factory).
  • Hierarchické klíče oddílů můžete zadat pouze do tří vrstev.
  • Hierarchické klíče oddílů je v současné době možné povolit jenom u nových kontejnerů. Cesty ke klíči oddílu musíte nastavit při vytváření kontejneru a později je nemůžete změnit. Pokud chcete pro existující kontejnery používat hierarchické oddíly, vytvořte nový kontejner s nastavenými hierarchickými klíči oddílu a přesuňte data pomocí úloh kopírování kontejneru.
  • Hierarchické klíče oddílů se v současné době podporují jenom pro účty ROZHRANÍ API pro NoSQL. Rozhraní API pro MongoDB a Cassandra se v současné době nepodporují.
  • Funkce Oprávnění v současné době nepodporuje hierarchické klíče oddílů. Nemůžete přiřadit oprávnění k částečné předponě hierarchického klíče oddílu. Oprávnění je možné přiřadit pouze k celé cestě klíče logického oddílu. Pokud jste například rozdělili oddíly TenantId podle – >UserId, nemůžete přiřadit oprávnění, která je určena pro určitou hodnotu TenantId. Pokud však zadáte hodnotu pro i TenantId "UserId", můžete pro klíč oddílu přiřadit oprávnění.

Další kroky