Vytváření triggerů a uživatelem definovaných funkcí
Azure Cosmos DB podporuje pretriggery a triggery po spuštění. Před úpravou položky databáze se před úpravou položky databáze spustí před provedením triggerů po úpravě položky databáze. Triggery se nespouštějí automaticky. Musí být zadány pro každou operaci databáze, ve které je chcete spustit. Po definování triggeru byste ho měli zaregistrovat pomocí sad SDK služby Azure Cosmos DB.
Příklady registrace a volání triggeru najdete v tématu pretriggery a post-triggery.
Pretriggery
Následující příklad ukazuje, jak se pretrigger používá k ověření vlastností vytvářené položky Azure Cosmos. Přidá do nově přidané položky vlastnost časového razítka, pokud ji neobsahuje.
function validateToDoItemTimestamp() {
var context = getContext();
var request = context.getRequest();
// item to be created in the current operation
var itemToCreate = request.getBody();
// validate properties
if (!("timestamp" in itemToCreate)) {
var ts = new Date();
itemToCreate["timestamp"] = ts.getTime();
}
// update the item that will be created
request.setBody(itemToCreate);
}
Pretriggery nemohou mít žádné vstupní parametry. Objekt požadavku v triggeru slouží k manipulaci se zprávou požadavku přidruženou k operaci. V předchozím příkladu se pretrigger spustí při vytváření položky Azure Cosmos a text zprávy požadavku obsahuje položku, která se má vytvořit ve formátu JSON.
Při registraci triggerů můžete určit operace, se kterými se můžou spouštět. Tato aktivační událost by se měla vytvořit s TriggerOperation
hodnotou TriggerOperation.Create
, pomocí triggeru v operaci nahrazení není povolená.
Příklady registrace a volání pretriggeru najdete v článku s pretriggery .
Triggery po akci
Následující příklad ukazuje post-trigger. Tato aktivační událost se dotazuje na položku metadat a aktualizuje ji podrobnostmi o nově vytvořené položce.
function updateMetadata() {
var context = getContext();
var container = context.getCollection();
var response = context.getResponse();
// item that was created
var createdItem = response.getBody();
// query for metadata document
var filterQuery = 'SELECT * FROM root r WHERE r.id = "_metadata"';
var accept = container.queryDocuments(container.getSelfLink(), filterQuery,
updateMetadataCallback);
if(!accept) throw "Unable to update metadata, abort";
function updateMetadataCallback(err, items, responseOptions) {
if(err) throw new Error("Error" + err.message);
if(items.length != 1) throw 'Unable to find metadata document';
var metadataItem = items[0];
// update metadata
metadataItem.createdItems += 1;
metadataItem.createdNames += " " + createdItem.id;
var accept = container.replaceDocument(metadataItem._self,
metadataItem, function(err, itemReplaced) {
if(err) throw "Unable to update metadata, abort";
});
if(!accept) throw "Unable to update metadata, abort";
return;
}
}
Jedna věc, kterou je důležité si uvědomit, je transakční spouštění triggerů ve službě Azure Cosmos DB. Aktivační událost po spuštění se spustí jako součást stejné transakce pro samotnou podkladovou položku. Během provádění po triggeru dojde k výjimce, která selže celou transakci. Všechno potvrzené se vrátí zpět a vrátí se výjimka.
Uživatelem definované funkce
Následující ukázka vytvoří UDF pro výpočet daně z příjmu pro různé závorky příjmů. Tato uživatelem definovaná funkce by se pak použila v dotazu. Pro účely tohoto příkladu předpokládejme, že existuje kontejner s názvem "Incomes" s vlastnostmi následujícím způsobem:
{
"name": "User One",
"country": "USA",
"income": 70000
}
Následující ukázka kódu je definice funkce pro výpočet daně z příjmu pro různé závorky příjmů:
function tax(income) {
if(income == undefined)
throw 'no input';
if (income < 1000)
return income * 0.1;
else if (income < 10000)
return income * 0.2;
else
return income * 0.4;
}