【发布时间】:2018-05-08 20:32:36
【问题描述】:
在本帖底部更新
我在 SQL Server 中有两个表,下面是每个表的简化视图。
表 1
| ObjectID | Name | Email |
+----------+------+-------+
| 1 | Ben | |
| 2 | Tom | |
表2
| ObjectID | Name | Email |
+-----------+------+---------------+
| 52 | Ben | ben@email.com |
| 53 | Tom | tom@email.com |
我想在更新 table1 的数据库中创建一个触发器,当我更新 name 字段时触发器会触发,并插入可以在 table2 中找到的电子邮件地址。
注意:两个表都有更多的列
注意2:当将一行插入表1时,它只接收一个ObjectID,然后在用户添加名称的地方进行更新。
用户添加此名称后,我希望数据库运行并查看table2,找到匹配的名称,然后返回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,看看它是否会这样做,但这也没有影响。这是我目前拥有的代码,请注意我使用了实际的表名和列名:
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 是员工用户名(我已经成功地对这两个字段进行了简单的连接,它工作正常,所以我已经排除了两种不同的数据类型的问题)
所以我很困惑为什么这个触发器甚至没有为我插入简单的“测试”文本。
有什么想法吗?
下面是回答我最初问题的最终代码,效果很好!谢谢@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
【问题讨论】:
-
为什么要创建触发器。创建一个接受名称作为参数的存储过程。根据名字,从table2中获取对应的email地址,插入到table1中。除非在极少数情况下,否则通常应避免使用触发器。触发器使事务变得更长,并且难以调试和解决问题。
-
@VenkataramanR 非常感谢这个建议,我是后端数据库的新手,我会研究存储过程,看看是否足够:)
-
@VenkataramanR 存储过程可以在更新表行时运行吗?还是手动触发存储过程?
-
Storeprocedure 不在更新上运行,但将使用它在两个表中插入。
-
但是,您的要求也可以使用触发器来完成。只需要校准工作流程。
标签: sql-server tsql database-trigger