SQL触发器更新另一个表

时间:2011-01-03 20:41:17

标签: sql triggers

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


PERSON表:

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

电子邮件表:

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

如您所见,这两个表在PERSONID列上链接。以下是我想要触发的内容:
如果更新了EMAIL表或插入了新行,我想将EMAILADDRESS字段复制到PERSON表上相应的条目(由PERSONID链接),如果ISPRIMARY字段等于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  

我相信触发器应该可以在任何时候更新或插入到电子邮件表中。

1 个答案:

答案 0 :(得分: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