Запись информации в триггер SQL Server

У меня есть таблица под названием dsReplicated.matDB и столбец fee_earner. Когда этот столбец обновляется, я хочу записать две части информации:

  • dsReplicated.matDB.mt_code
  • dsReplicated.matDB.fee_earner

из строки, в которой был обновлен fee_earner.

У меня есть базовый синтаксис для выполнения каких-либо действий, когда столбец обновляется, но мне нужна рука с указанным выше, чтобы передать это через строку.

ALTER TRIGGER [dsReplicated].[tr_mfeModified] 
ON [dsReplicated].[matdb]
AFTER UPDATE
AS 
BEGIN
    IF (UPDATE(fee_earner))
    BEGIN
        print 'Matter fee earner changed to '
    END 
END

Кроме того, функции UPDATE в триггере не важно, изменилось ли значение, только то, что столбец является частью оператора обновления.

Sean Lange 25.06.2018 16:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
16
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема с триггерами в SQL-сервере заключается в том, что они называются по одному на каждый оператор SQL - а не один раз на строку. Таким образом, если ваш оператор UPDATE обновляет 10 строк, ваш триггер называется однажды, а псевдотаблицы Inserted и Deleted внутри триггера каждая содержат по 10 строк данных.

Чтобы увидеть, изменился ли fee_earner, я бы рекомендовал использовать этот подход вместо функции UPDATE():

ALTER TRIGGER [dsReplicated].[tr_mfeModified] 
ON [dsReplicated].[matdb]
AFTER UPDATE
AS 
BEGIN
    -- I'm just *speculating* here what you want to do with that information - adapt as needed!
    INSERT INTO dbo.AuditTable (Id, TriggerTimeStamp, Mt_Code, Old_Fee_Earner, New_Fee_Earner)
        SELECT
            i.PrimaryKey, SYSDATETIME(), i.Mt_Code, d.fee_earner, i.fee_earner
        FROM Inserted i
        -- use the two pseudo tables to detect if the column "fee_earner" has 
        -- changed with the UPDATE operation
        INNER JOIN Deleted d ON i.PrimaryKey = d.PrimaryKey 
                             AND d.fee_earner <> i.fee_earner
END

Псевдотаблица Deleted содержит значения перед и UPDATE - вот почему я беру d.fee_earner в качестве значения для столбца Old_Fee_Earner в таблице аудита.

Псевдотаблица Inserted содержит значения после и UPDATE - поэтому я беру другие значения из этой псевдотаблицы Inserted для вставки в таблицу аудита.

Обратите внимание, что для работы этого триггера в этой таблице действительно должен быть первичный ключ неизменный. В любом случае это рекомендуется для таблицы данных любой в SQL Server.

Спасибо за это абсолютно блестяще - на самом деле концепция псевдотаблиц Inserted и Deleted была для меня совершенно новой, поэтому я не понимал, как она будет работать, пока не попробовал. Очень рад этому, еще раз спасибо.

Ed Mozley 25.06.2018 21:48

Другие вопросы по теме