我有一个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
我相信只要有更新或将其插入电子邮件表,触发器就可以工作。
问题将与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