2011-01-03 4 views
3

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


PERSON таблице:

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

EMAIL стол:

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

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


UPDATE 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 

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

ответ

4

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

Кроме того, что, если строка изменяется, чтобы не быть первичным, вы удаляете запись из PERSON?

Так что все еще кажется, что некоторые открытые вопросы в проблемной области, но вот удар по тому, как будет выглядеть триггер. Вы можете добавить некоторые вещи, которые ищут строки, где происходит изменение, но будьте осторожны с 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 
+0

Мне нравится, куда вы направляетесь. Система Maximo гарантирует только одну уникальную запись ISPRIMARY на PERSONID. Я согласен, что немного странно, как они это настроили, но я думаю, я понимаю, почему они это сделали. –

Смежные вопросы