Tworzenie wyzwalaczy i funkcji zdefiniowanych przez użytkownika
Usługa Azure Cosmos DB obsługuje wyzwalacze wstępne i wyzwalacze po operacji. Wyzwalacze wstępne są wykonywane przed zmodyfikowaniem elementu bazy danych i wyzwalaczami po zmodyfikowaniu elementu bazy danych. Wyzwalacze nie są wykonywane automatycznie. Należy je określić dla każdej operacji bazy danych, w której mają być wykonywane. Po zdefiniowaniu wyzwalacza należy zarejestrować go przy użyciu zestawów SDK usługi Azure Cosmos DB.
Przykłady rejestrowania i wywoływania wyzwalacza można znaleźć w temacie Pretriggers and post-triggers (Wyzwalacze wstępne i wyzwalacze po wywołaniu).
Pretriggers
W poniższym przykładzie pokazano, jak jest używany pretrigger do weryfikowania właściwości tworzonego elementu usługi Azure Cosmos. Dodaje właściwość znacznika czasu do nowo dodanego elementu, jeśli nie zawiera tej właściwości.
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);
}
Pretriggers nie może mieć żadnych parametrów wejściowych. Obiekt żądania w wyzwalaczu służy do manipulowania komunikatem żądania skojarzonym z tą operacją. W poprzednim przykładzie podczas tworzenia elementu usługi Azure Cosmos jest uruchamiany moduł wstępny, a treść komunikatu żądania zawiera element, który ma zostać utworzony w formacie JSON.
Podczas rejestrowania wyzwalaczy można określić operacje, z którymi można je uruchamiać. Ten wyzwalacz należy utworzyć z wartością TriggerOperation
TriggerOperation.Create
, używając wyzwalacza w operacji zastępowania, nie jest dozwolony.
Przykłady rejestrowania i wywoływania pretrigger można znaleźć w artykule pretriggers ( Pretriggers ).
Wyzwalacze wykonywane po operacji
W poniższym przykładzie pokazano wyzwalacz wykonywany po operacji. Ten wyzwalacz wysyła zapytanie o element metadanych i aktualizuje go za pomocą informacji o nowo utworzonym elemencie.
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;
}
}
Jedną rzeczą, o której należy pamiętać, jest transakcyjne wykonywanie wyzwalaczy w usłudze Azure Cosmos DB. Wyzwalacz wykonywany po operacji w ramach tej samej transakcji dla samego elementu bazowego. Wyjątek podczas wykonywania po wyzwoleniu kończy się niepowodzeniem całej transakcji. Wszystkie zatwierdzone elementy są cofane i zwracany jest wyjątek.
Funkcje zdefiniowane przez użytkownika
Poniższy przykład pokazuje tworzenie funkcji zdefiniowanej przez użytkownika w celu obliczenia podatku dochodowego dla różnych przedziałów dochodu. Ta funkcja zdefiniowana przez użytkownika zostanie następnie użyta w zapytaniu. Na potrzeby tego przykładu założono, że istnieje kontener o nazwie "Dochody" z właściwościami w następujący sposób:
{
"name": "User One",
"country": "USA",
"income": 70000
}
Poniższy przykład kodu to definicja funkcji do obliczenia podatku dochodowego dla różnych przedziałów dochodów:
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;
}