SQL Trigger для обновления другой таблицы - PullRequest
3 голосов
/ 03 января 2011

У меня есть база данных Maximo, структура таблицы которой я не могу изменить. Я пытаюсь скопировать основной адрес электронной почты в таблицу PERSON каждый раз, когда она создается или обновляется. Следующая структура описывает таблицу PERSON и EMAIL


Таблица ПЕРСОНА:

PERSONID | EMAIL | ...(other irrelevant columns)...

EMAIL таблица:

PERSONID | EMAILADDRESS | ISPRIMARY | ...(other irrelevant columns)...

Как видите, две таблицы связаны в столбце PERSONID. Вот что я хотел бы сделать триггером:
Если таблица EMAIL обновлена ​​или вставлена ​​новая строка, я хотел бы скопировать поле EMAILADDRESS в соответствующую запись (как связано с PERSONID) в таблице PERSON, если поле ISPRIMARY равно 1 (1 означает основной, 0 означает вторичные).
Я не написал много триггеров, поэтому хочу убедиться, что смотрю только строки, которые обновляются или вставляются в таблицу EMAIL, и обновляю таблицу PERSON только при наличии нового / обновленного основного адреса электронной почты. Заранее спасибо за вашу помощь!


ОБНОВЛЕНИЕ 1:
Посмотрев на ответ Кейда, вот триггер, который я начинаю формировать:

CREATE TRIGGER EMAIL_update ON UPDATE,INSERT  AS  BEGIN      
UPDATE p  
SET p.email = i.emailaddress
FROM dbo.PERSON as p
INNER JOIN inserted AS i ON i.PERSONID = p.PERSONID AND i.isprimary=1 
END  

Я считаю, что триггер должен работать каждый раз, когда что-то обновляется ИЛИ вставляется в таблицу электронной почты.

1 Ответ

4 голосов
/ 03 января 2011

Проблема будет связана с отсутствием первичного ключа в таблице EMAIL. Триггеры лучше всего работают с неизменяемыми первичными ключами.

Кроме того, что, если строка изменяется на не первичную, вы удаляете запись из ЛИЦА?

Так что все еще похоже на некоторые открытые вопросы в проблемной области, но вот удар по тому, на что был бы похож триггер. Вы можете добавить некоторые вещи, которые ищут строки, в которых действительно происходят изменения, но будьте осторожны с NULL.

CREATE TRIGGER EMAIL_update ON UPDATE
AS
BEGIN
    UPDATE PERSON
    SET EMAIL = i.EMAILADDRESS    
    FROM PERSON
    INNER JOIN inserted AS i
        ON i.PERSONID = PERSON.PERSONID
    INNER JOIN deleted AS d -- could try changing this to a left join and use same trigger for INSERT
        ON -- what? could use PERSONID, but it's not unique
    WHERE i.ISPRIMARY = 1 -- This helps with uniqueness, but what about things leaving primary?
    -- AND i.EMAILADDRESS <> PERSON.EMAIL -- Could add this (what about NULLs?)
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...