一尘不染

SQL触发器更新另一个表

sql

我有一个Maximo数据库,该数据库具有无法更改的表结构。我希望在创建或更新主电子邮件地址时将其复制到PERSON表中。以下结构描述了PERSON表和EMAIL表


PERSON表:

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

EMAIL表:

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

如您所见,这两个表在PERSONID列上链接。这是我希望触发器执行的操作:
如果EMAIL表已更新或插入了新行,那么如果ISPRIMARY字段,我想将EMAILADDRESS字段复制到PERSON表上的相应条目(由PERSONID链接)。等于1(1代表主要,0代表次要)。
我没有编写很多触发器,因此我想确保只查看正在更新或插入到EMAIL表中的行,并且仅在有新的/更新的主电子邮件地址时才更新PERSON表。预先感谢您的所有帮助!


更新1:
查看Cade的回复后,这是我开始形成的触发器:

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

我相信只要有更新或将其插入电子邮件表,触发器就可以工作。


阅读 219

收藏
2021-03-08

共1个答案

一尘不染

问题将与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
2021-03-08