【问题标题】:SQL Trigger to update another tableSQL 触发器更新另一个表
【发布时间】:2017-08-29 23:26:51
【问题描述】:

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


PERSON 表:

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

EMAIL 表:

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  

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

【问题讨论】:

    标签: sql triggers


    【解决方案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
    

    【讨论】:

    • 我喜欢你的想法。 Maximo 系统确实保证每个 PERSONID 只有一个唯一的 ISPRIMARY 条目。我同意他们的设置方式有点奇怪,但我想我理解他们为什么这样做。
    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2014-02-23
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多