创建更新触发器以根据表 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_officer
和 cus_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
在此底部更新 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_officer
和 cus_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