Создание триггера обновления для обновления столбца в таблице 1 на основе значения в таблице 2 - PullRequest
0 голосов
/ 07 мая 2018

ОБНОВЛЕНИЕ ВНУТРИ ЭТОГО ПОЧТЫ


У меня есть две таблицы в SQL Server, упрощенное представление каждой из которых приведено ниже.

Table1

| ObjectID | Name | Email |
+----------+------+-------+
| 1        | Ben  |       |
| 2        | Tom  |       |

Table2

| ObjectID  | Name |     Email     |
+-----------+------+---------------+
| 52        | Ben  | ben@email.com |
| 53        | Tom  | tom@email.com |

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

Примечание: в обеих таблицах есть еще много столбцов

Примечание2: когда строка вставляется в таблицу 1, она получает ТОЛЬКО ObjectID, затем выполняется обновление, когда пользователь добавляет имя.

После того, как пользователь добавляет это имя, я хочу, чтобы база данных побежала и посмотрела на table2, нашла подходящее имя, вернулась к table1 и записала данные в.

Я написал (безуспешно) приведенный ниже код, я пытался использовать update() и кучу других вещей, но я чувствую, что я далеко от цели:

CREATE TRIGGER "acc_insert_email" 
ON TABLE1
AFTER UPDATE
AS
BEGIN
    INSERT INTO TABLE1(email)
        SELECT i.email 
        FROM TABLE1 t 
        INNER JOIN TABLE2 i ON t.email = i.email
END

Кто-нибудь может направить меня обратно в правильном направлении?

Заранее спасибо.


Итак, я проверил ответ, предоставленный @Ezlo, но мне не повезло ... Я немного изменил его, чтобы вместо этого вставить слово TEST в столбец, чтобы посмотреть, будет ли оно вообще так, но это также не имеет эффект. Это код, который у меня есть в настоящее время, обратите внимание, что я использовал реальные имена таблиц и столбцов:

CREATE TRIGGER "gisadmin"."acc_UpdateOfficerDetails" ON NOXIOUS_WEED_INSPECTION_POINT AFTER UPDATE
AS
BEGIN

    IF UPDATE(authorised_officer_email)
    BEGIN

        UPDATE T SET
            authorised_officer_email = 'TEST'
        FROM
            inserted AS I
            INNER JOIN NOXIOUS_WEED_INSPECTION_POINT AS T ON I.authorised_officer = T.authorised_officer
            LEFT JOIN AUTH_DB.authlive.dbo.acc_weave_emp_details AS N ON I.authorised_officer = N.cus_idd

    END
END

authorised_officer и cus_idd - это имя пользователя персонала (я успешно выполнил простое объединение этих двух полей, оно отлично работает, поэтому я исключил наличие двух разных типов данных)

Так что я озадачен тем, почему этот триггер даже не вставляет для меня простой текст "ТЕСТ".

Есть идеи?


Ниже приведен окончательный код, который отвечает на мой оригинальный вопрос, работает фантастически! Спасибо @ EzLo

CREATE TRIGGER "gisadmin"."acc_UpdateOfficerDetails" ON NOXIOUS_WEED_INSPECTION_POINT AFTER
UPDATE AS BEGIN IF
UPDATE
    (authorised_officer) BEGIN
UPDATE
    T
SET
    authorised_officer_email = A.mto_lst
FROM
    inserted AS I
INNER JOIN
    NOXIOUS_WEED_INSPECTION_POINT AS T
ON
    I.authorised_officer = T.authorised_officer
LEFT JOIN
    AUTH_DB.authlive.dbo.acc_weave_emp_details AS A
ON
    I.authorised_officer = A.cus_idd
END
END

1 Ответ

0 голосов
/ 07 мая 2018

Можно использовать следующее.

CREATE TRIGGER tr_UpdateTable1Email ON TABLE1 AFTER UPDATE
AS
BEGIN

    IF UPDATE(Name)
    BEGIN

        UPDATE T SET
            Email = N.Email
        FROM
            inserted AS I
            INNER JOIN TABLE1 AS T ON I.Name = T.Name
            LEFT JOIN TABLE2 AS N ON I.Name = N.Name

    END
END

Триггер будет выполняться при TABLE1 обновлениях, а внутреннее обновление будет выполняться только в том случае, если исходный оператор обновления содержит столбец name.inserted - это специальная триггерная таблица, которая содержит строки таблицы отслеживания (в данном случае TABLE1), которые были обновлены.Присоединитесь к inserted с TABLE1, чтобы иметь возможность обновлять правильные электронные письма, а затем перейдите к поиску электронных писем для обновления до TABLE2.

Позвольте мне упомянуть, что у вас есть денормализованные данные, и это вызывает проблемы с обслуживанием (что произойдет, если кто-то обновит имя или адрес электронной почты из TABLE2? записи в TABLE1 будут не синхронизированы).Вы должны хранить имена и электронные письма (и другие связанные данные) только в одном месте, поэтому требуется только одно обновление.


РЕДАКТИРОВАТЬ : обновление более чем в 1 столбец (нетскобки необходимы).

ALTER TRIGGER "gisadmin"."acc_UpdateOfficerDetails" ON NOXIOUS_WEED_INSPECTION_POINT AFTER UPDATE 
AS 
BEGIN 
    IF UPDATE (authorised_officer) 
    BEGIN

        UPDATE
            T
        SET
            authorised_officer_email = A.mto_lst,
            authorised_officer_phone = A.bus_mob
        FROM
            inserted AS I
        INNER JOIN
            NOXIOUS_WEED_INSPECTION_POINT AS T
        ON
            I.authorised_officer = T.authorised_officer
        LEFT JOIN
            AUTH_DB.authlive.dbo.acc_weave_emp_details AS A
        ON
            I.authorised_officer = A.cus_idd

    END
END
...