Способ захвата набора результатов вместо триггера вставки в SQL Server 2016 - PullRequest
0 голосов
/ 14 июля 2020

У меня есть таблица, в которой используется триггер вместо вставки. Триггер обрабатывает данные для каждой вставленной строки перед ее вставкой. Поскольку вставленная таблица не может быть изменена, она была реализована с использованием таблицы temp (#). В конце триггера выполняется выбор из временной таблицы, чтобы вернуть вставленные данные вызывающему клиенту. Когда я выполняю вставку в SSMS, я вижу возвращаемые данные, а все столбцы имеют имена и значения. Мой триггер выглядит так:

Create   TRIGGER [dbo].[RealTableInsteadOfInsert] on [dbo].[RealTable]
INSTEAD OF INSERT 
AS
BEGIN 
    set nocount on;
    declare @lastDigit int;
    if exists (select * from inserted)
    Begin

        Select * 
        into #tempInserted
        from inserted

        .... Logic to add and manipulate column data .....

        INSERT INTO RealTAble(id, col1, col2, col3,....)
            Select *
            from #tempInserted;

        Select id as insertId,  *
        from #tempInserted;
    END
End

Мой вопрос в том, как я могу записать выходные данные триггера вместо триггера в таблицу для дальнейшей обработки с использованием возвращенных данных. Я не могу использовать предложение вывода в операторе вставки, поскольку временная таблица больше не существует, а данные, которые были рассчитаны / изменены при вставке, не были выполнены во вставленной таблице. Есть ли у меня единственный вариант обновить триггер, чтобы использовать глобальную временную таблицу вместо локальной?

1 Ответ

0 голосов
/ 14 июля 2020

У вас есть два основных варианта:

  1. Отправить данные через сервисного брокера. Это сложно и потенциально медленно. С другой стороны, это позволяет вам выполнять вашу дальнейшую обработку независимо от исходной транзакции, что хорошо в некоторых случаях использования.
  2. Записывать данные в реальную таблицу. Этот может также предоставить вам транзакционную развязку, но вы не получите автоматическую c активацию логики c независимой обработки, если хотите.

Хорошо, но если вы пишете в настоящую таблицу, и триггер срабатывает множество процессов, как вы находите «свои» данные? Если оставить в стороне тот факт, что глобальная временная таблица имеет ту же проблему, если вы не хотите получить динамический c, одним из решений является использование таблицы с ключами процессов, как описано Эрландом Соммарскогом в его статье о совместном использовании данных .

Возврат данных из триггеров (ie, клиенту) - это плохая идея. Возможность делать это будет скоро будет удалена Я знаю, что вам не нужно делать это в вашем решении, просто предупреждая вас.

...