Триггер Cosmos Db не запускается при вставке нового документа

Я использую Azure Cosmos DB. Я создал простой триггер на портале Azure следующим образом:

введите здесь описание изображения

  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);

К сожалению, этот триггер не срабатывает, когда я вставляю новые документы. Я также попытался установить «Тип триггера» на «Пост». Я что-то упустил?


person fascynacja    schedule 01.04.2020    source источник


Ответы (3)


Отличный вопрос! Я всегда думал, что триггеры будут запускаться автоматически :).

Я считаю, что триггеры не запускаются автоматически при вставке документа. Что вам нужно сделать, так это указать триггер, который вы хотите запустить при создании документа.

Что вам нужно сделать, так это зарегистрировать триггер, передав имя триггера в качестве параметра запроса при отправке запроса на создание документа.

Например, см. код здесь: https://docs.microsoft.com/en-us/azure/cosmos-db/how-to-use-stored-procedures-triggers-udfs#pre-triggers. ( также скопировано ниже). Обратите внимание на использование PreTriggerInclude в 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);
person Gaurav Mantri    schedule 01.04.2020
comment
Мне удалось создать код Java, который информирует Azure о запуске триггера: RequestOptions options = new RequestOptions(); options.setPreTriggerInclude(Arrays.asList(pre)); . Но проблема в том, что эта таблица уже обновлена ​​с того места, где я не могу изменить код, поэтому было бы идеально, если бы триггер срабатывал сам ;-) - person fascynacja; 01.04.2020
comment
so it would be perfect if the trigger would trigger himself ... Я тоже :). Основываясь на опыте работы с SQL, я ожидал, что он будет работать сам по себе... ааа... вы узнаете что-то новое каждый день. - person Gaurav Mantri; 01.04.2020
comment
Гуарав, я приму ваш ответ, так как он правильный, но пусть вопрос немного повиснет, может быть, у кого-то еще будут другие предложения :) - person fascynacja; 01.04.2020
comment
Абсолютно! Я также с нетерпением жду, когда наши друзья из команды Cosmos DB присоединятся и предоставят решение. - person Gaurav Mantri; 01.04.2020
comment
Просто подумав вслух, можно ли справиться с этой ситуацией с помощью механизма Change Feed, где вы запускаете функцию при вставке документа? - person Gaurav Mantri; 01.04.2020

Автоматическое срабатывание триггеров в реляционных базах данных имеет смысл, поскольку в базе данных есть схема, и вы как бы знаете, что обрабатывать в логике триггера. В базе данных NoSQL, поскольку схемы нет, вы можете получить большой скрипт для обработки всех видов исключений. Большой скрипт в триггерах означает более высокие счета в облаке. Автоматизация триггеров может заставить многих клиентов выставлять очень высокие счета, особенно в решениях IOT. Вы можете прочитать о триггерах до и после запуска Azure Cosmos DB в моем посте. https://h-savran.blogspot.com/2020/03/create-triggers.html

person Hasan Savran    schedule 01.04.2020
comment
Спасибо за твой ответ. Ваше объяснение имеет смысл, хотя я бы предпочел сам решить, хочу ли я, чтобы мне платили больше за мои триггеры или нет:) также я должен решать, буду ли я поднимать свои триггеры или просто изменю одну строку со всеми последствиями. Но, видимо, здесь не так уж и большой выбор. - person fascynacja; 02.04.2020
comment
а как насчет создания предмета прямо из портала? :) - person fascynacja; 02.04.2020

Единственный способ, согласно ответам @Guarav Mantri и @Hasan Savaran, - указать триггер при создании элемента через API. Мне удалось сделать это в Java Azure SDK следующим образом:

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

Хотя я не доволен этим решением, потому что, например, триггер не будет срабатывать при создании элемента через портал.

person fascynacja    schedule 02.04.2020