更新另一个表的SQL触发器
我有一个Maximo数据库,它的表结构我无法更改。我希望在创建或更新时将主电子邮件地址复制到PERSON表中。下面的结构描述了PERSON表和EMAIL表更新另一个表的SQL触发器,sql,triggers,Sql,Triggers,我有一个Maximo数据库,它的表结构我无法更改。我希望在创建或更新时将主电子邮件地址复制到PERSON表中。下面的结构描述了PERSON表和EMAIL表 人员表: PERSONID | EMAIL | ...(other irrelevant columns)... 电子邮件表格: PERSONID | EMAILADDRESS | ISPRIMARY | ...(other irrelevant columns)... 如您所见,这两个表在PERSONID列上链接。下面是我希望触发器
人员表:
PERSONID | EMAIL | ...(other irrelevant columns)...
电子邮件表格:
PERSONID | EMAILADDRESS | ISPRIMARY | ...(other irrelevant columns)...
如您所见,这两个表在PERSONID列上链接。下面是我希望触发器执行的操作:
如果更新了电子邮件表或插入了新行,我希望将EMAILADDRESS字段复制到PERSON表上的相应条目(由PERSONID链接),前提是iPrimary字段等于1(1表示主要,0表示次要)。
我没有编写太多触发器,因此我希望确保我只查看正在更新或插入到电子邮件表中的行,并且仅在有新的/更新的主电子邮件地址时更新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
我相信,只要有东西被更新或插入到电子邮件表中,触发器就会工作 问题将与电子邮件表上缺少主键有关。触发器在使用不可变主键时效果最好 另外,如果一行更改为非主行,您是否从PERSON中删除该条目 因此,在问题领域似乎仍然有一些悬而未决的问题,但这里有一个关于触发器的尝试。您可以添加一些查找实际发生更改的行的内容,但要注意空值
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
创建触发电子邮件\u更新时更新
作为
开始
更新人
设置EMAIL=i.EMAILADDRESS
从个人
内部联接插入为i
关于i.PERSONID=PERSON.PERSONID
作为d删除的内部联接--可以尝试将其更改为左联接,并对INSERT使用相同的触发器
什么?可以使用PERSONID,但它不是唯一的
其中i.ISPRIMARY=1——这有助于实现唯一性,但离开主节点的情况又如何呢?
--和i.EMAILADDRESS PERSON.EMAIL--可以添加这个(空值呢?)
结束
我喜欢你这样做。Maximo系统只保证每个PERSONID有一个唯一的iPrimary条目。我同意他们的设置有点奇怪,但我想我理解他们为什么那样做。