创建更新触发器以根据表 2 中的值更新表 1 中的列

Creating an update trigger to update a column in table1 based on a value in table2

在此底部更新 POST


我在 SQL 服务器中有两个 table,下面是每个的简化视图。

表 1

| ObjectID | Name | Email |
+----------+------+-------+
| 1        | Ben  |       |
| 2        | Tom  |       |

表2

| ObjectID  | Name |     Email     |
+-----------+------+---------------+
| 52        | Ben  | ben@email.com |
| 53        | Tom  | tom@email.com |

我想在数据库中创建一个更新 table1 的触发器,当我更新名称字段时触发器会触发,并插入可以在 table2 中找到的电子邮件地址.

注意:两个 table 都有更多的列

注意 2:当一行被插入到 table1 中时,它只会收到一个 ObjectID,然后在用户添加名称的地方进行更新。

用户添加这个名字后就是我想把数据库运行关掉再看table2,找到匹配的名字,然后return改为table1 并在其中写入数据。

我写了(不成功)下面的代码,我试过使用 update() 和一堆其他的东西,但我觉得我离题太远了:

CREATE TRIGGER "acc_insert_email" 
ON TABLE1
AFTER UPDATE
AS
BEGIN
    INSERT INTO TABLE1(email)
        SELECT i.email 
        FROM TABLE1 t 
        INNER JOIN TABLE2 i ON t.email = i.email
END

谁能指出我正确的方向?

提前致谢。


所以我已经测试了@Ezlo 提供的答案,但没有任何运气......我稍微修改它以在列中插入单词 TEST,看看它是否会这样做,但这也没有效果。这是我目前的代码,请注意我使用了实际的 table 和列名:

CREATE TRIGGER "gisadmin"."acc_UpdateOfficerDetails" ON NOXIOUS_WEED_INSPECTION_POINT AFTER UPDATE
AS
BEGIN

    IF UPDATE(authorised_officer_email)
    BEGIN

        UPDATE T SET
            authorised_officer_email = 'TEST'
        FROM
            inserted AS I
            INNER JOIN NOXIOUS_WEED_INSPECTION_POINT AS T ON I.authorised_officer = T.authorised_officer
            LEFT JOIN AUTH_DB.authlive.dbo.acc_weave_emp_details AS N ON I.authorised_officer = N.cus_idd

    END
END

authorised_officercus_idd 是员工用户名(我已经成功地对这两个字段进行了简单的连接,效果很好,所以我排除了两种不同数据类型的问题)

所以我很困惑为什么这个触发器甚至没有为我插入简单的 'TEST' 文本。

有什么想法吗?


下面是回答我最初问题的最终代码,非常棒!谢谢@EzLo

CREATE TRIGGER "gisadmin"."acc_UpdateOfficerDetails" ON NOXIOUS_WEED_INSPECTION_POINT AFTER
UPDATE AS BEGIN IF
UPDATE
    (authorised_officer) BEGIN
UPDATE
    T
SET
    authorised_officer_email = A.mto_lst
FROM
    inserted AS I
INNER JOIN
    NOXIOUS_WEED_INSPECTION_POINT AS T
ON
    I.authorised_officer = T.authorised_officer
LEFT JOIN
    AUTH_DB.authlive.dbo.acc_weave_emp_details AS A
ON
    I.authorised_officer = A.cus_idd
END
END

您可以使用以下内容。

CREATE TRIGGER tr_UpdateTable1Email ON TABLE1 AFTER UPDATE
AS
BEGIN

    IF UPDATE(Name)
    BEGIN

        UPDATE T SET
            Email = N.Email
        FROM
            inserted AS I
            INNER JOIN TABLE1 AS T ON I.Name = T.Name
            LEFT JOIN TABLE2 AS N ON I.Name = N.Name

    END
END

触发器将在 TABLE1 更新时执行,只有当原始更新语句包含 name 列时才会执行内部更新。 inserted 是一个特殊触发器 table,它保存更新的跟踪行 table(在本例中为 TABLE1)。将 inserted 加入 TABLE1 以便能够更新正确的电子邮件,然后搜索电子邮件以更新至 TABLE2

让我提一下,您对数据进行了非规范化处理,这会导致维护问题(如果有人从 TABLE2 更新姓名或电子邮件会怎样?TABLE1 的记录将不同步)。您应该将姓名和电子邮件(以及其他相关数据)保留在一处,因此只需要更新一次。


编辑:更新超过 1 列(不需要括号)。

ALTER TRIGGER "gisadmin"."acc_UpdateOfficerDetails" ON NOXIOUS_WEED_INSPECTION_POINT AFTER UPDATE 
AS 
BEGIN 
    IF UPDATE (authorised_officer) 
    BEGIN

        UPDATE
            T
        SET
            authorised_officer_email = A.mto_lst,
            authorised_officer_phone = A.bus_mob
        FROM
            inserted AS I
        INNER JOIN
            NOXIOUS_WEED_INSPECTION_POINT AS T
        ON
            I.authorised_officer = T.authorised_officer
        LEFT JOIN
            AUTH_DB.authlive.dbo.acc_weave_emp_details AS A
        ON
            I.authorised_officer = A.cus_idd

    END
END