Używam Azure Cosmos DB. Utworzyłem prosty wyzwalacz w witrynie Azure Portal w następujący sposób:

enter image description here

  var context = getContext();
  var request = context.getRequest();

  // item to be created in the current operation
  var itemToCreate = request.getBody();
  itemToCreate["address"] = "test";

  // update the item that will be created
  request.setBody(itemToCreate);

Niestety ten wyzwalacz nie jest wyzwalany, gdy wstawiam nowe dokumenty. Próbowałem również ustawić „Typ wyzwalacza” na „Publikuj”. Czy coś mi brakuje?

3
fascynacja 1 kwiecień 2020, 13:52

3 odpowiedzi

Najlepsza odpowiedź

Świetne pytanie! Zawsze myślałem, że wyzwalacze będą działać automatycznie :).

Uważam, że wyzwalacze nie są uruchamiane automatycznie po wstawieniu dokumentu. Musisz tylko określić wyzwalacz, który chcesz uruchomić podczas tworzenia dokumentu.

Musisz zarejestrować wyzwalacz, przekazując nazwę wyzwalacza jako opcję żądania podczas wysyłania żądania utworzenia dokumentu.

Na przykład zobacz kod tutaj: https://docs.microsoft.com/en-us/azure/cosmos-db/how-to-use-stored-procedures-triggers-udfs#pre-triggers ( skopiowane również poniżej). Zwróć uwagę na użycie PreTriggerInclude w RequestOptions:

dynamic newItem = new
{
    category = "Personal",
    name = "Groceries",
    description = "Pick up strawberries",
    isComplete = false
};

Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
RequestOptions requestOptions = new RequestOptions { PreTriggerInclude = new List<string> { "trgPreValidateToDoItemTimestamp" } };
await client.CreateDocumentAsync(containerUri, newItem, requestOptions);
5
Stopped Contributing 1 kwiecień 2020, 15:27

Jedynym sposobem, zgodnie z odpowiedziami @Guarav Mantri i @Hasan Savaran, jest określenie wyzwalacza podczas tworzenia elementu poprzez API. Udało mi się to zrobić w Java Azure SDK w ten sposób:

 RequestOptions options = new RequestOptions();
 options.setPreTriggerInclude(Arrays.asList("pre"));
 documentClient.createDocument(
                    collectionLink(),
                    documentToAdd,
                    options,
                    true);

Chociaż nie jestem zadowolony z tego rozwiązania, ponieważ na przykład wyzwalacz nie zostanie wyzwolony podczas tworzenia przedmiotu przez Portal.

0
fascynacja 2 kwiecień 2020, 09:29

Automatyczne uruchamianie wyzwalaczy w relacyjnych bazach danych ma sens, ponieważ w programie znajduje się schemat bazy danych, wiesz, z czym postępować w logice wyzwalacza. W bazie danych NoSQL, ponieważ nie ma schematu, możesz otrzymać duży skrypt do obsługi wszelkiego rodzaju wyjątków. Duży skrypt w wyzwalaczach oznacza wyższe rachunki w chmurze. Automatyczne uruchamianie wyzwalaczy może sprawić, że wielu klientów wystawi naprawdę wysokie rachunki, szczególnie w rozwiązaniach IOT. Możesz przeczytać o wyzwalaczach przed / po Azure Cosmos DB w moim poście. https://h-savran.blogspot.com/2020/03/ create-triggers.html

2
Hasan Savran 1 kwiecień 2020, 14:47