我有一个 Maximo 数据库,其表结构无法更改。我希望在创建或更新时将主要电子邮件地址复制到 PERSON 表中。以下结构描述了 PERSON 表和 EMAIL 表
人员表:
PERSONID | EMAIL | ...(other irrelevant columns)...
电子邮件表:
PERSONID | EMAILADDRESS | ISPRIMARY | ...(other irrelevant columns)...
正如您所看到的,两个表在 PERSONID 列上链接。这是我希望触发器执行的操作:
如果更新 EMAIL 表或插入新行,我想将 EMAILADDRESS 字段复制到 PERSON 表上的相应条目(由 PERSONID 链接),如果 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
我相信只要更新或插入电子邮件表中的内容,触发器就应该起作用。
问题与 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)