Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新另一个表的SQL触发器_Sql_Triggers - Fatal编程技术网

更新另一个表的SQL触发器

更新另一个表的SQL触发器,sql,triggers,Sql,Triggers,我有一个Maximo数据库,它的表结构我无法更改。我希望在创建或更新时将主电子邮件地址复制到PERSON表中。下面的结构描述了PERSON表和EMAIL表 人员表: PERSONID | EMAIL | ...(other irrelevant columns)... 电子邮件表格: PERSONID | EMAILADDRESS | ISPRIMARY | ...(other irrelevant columns)... 如您所见,这两个表在PERSONID列上链接。下面是我希望触发器

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


人员表:

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条目。我同意他们的设置有点奇怪,但我想我理解他们为什么那样做。