Dja*_*ngo 5 sql sql-server triggers sql-server-2008
我有两个表,Table_A和Table_B.Table_A与Table_B具有一对多的关系.
在子表(Table_B)中插入记录后,我想使用触发器从父表(Table_A)中的字段中获取值,并更新Table_B中当前插入的记录.
表-A
PK|EmpID|MemID|Firstname|Lastname
----------------------------------
1 |1234 |AB123|John | Doe
2 |5678 |CD456|Jane | Smith
Run Code Online (Sandbox Code Playgroud)
表-B
PK|EmpID|MemID|Description
---------------------
1 |1234 |NULL |Finance
2 |1234 |NULL |IT
3 |5678 |NULL |Finance
4 |5678 |NULL |Management
Run Code Online (Sandbox Code Playgroud)
触发器应该从Table_A中获取MemID值,并在Table_B中更新它的相应值,其中[Table_A].[EmpID] = [Table_B].[EmpID].当然,在表_B中的4个插入后,结果应如下所示:
PK|EmpID|MemID|Description
---------------------
1 |1234 |AB123|Finance
2 |1234 |AB123|IT
3 |5678 |CD456|Finance
4 |5678 |CD456|Management
Run Code Online (Sandbox Code Playgroud)
我广泛搜索了其他技术站点,但似乎找不到这个特定场景.作为一个绝望的举动,我已经注册到这个网站,这将是我的第一篇求助信.
以下是我尝试在MS SQL Server 2008 R2中创建第一个触发器的徒劳尝试.
CREATE TRIGGER dbo.trgInsMemID
ON dbo.Table_B
AFTER INSERT
AS
BEGIN
UPDATE dbo.Table_B
SET MemID =
(SELECT MemID
FROM inserted i
JOIN dbo.Table_A c ON c.EmpID = i.EmpID)
FROM dbo.Table_B b
JOIN inserted i ON i.MemID = b.MemID
END
Run Code Online (Sandbox Code Playgroud)
我相信您会希望您的更新语句更改为如下所示:
UPDATE b
SET b.MemId = a.MemId
FROM dbo.Table_B AS b
INNER JOIN Inserted AS i ON b.EmpId = i.EmpId
INNER JOIN dbo.Table_A AS a ON b.EmpId = a.EmpId
Run Code Online (Sandbox Code Playgroud)
这将仅更新 b 中也在表中的记录insterted。(第一的INNER JOIN)
然后它将INNER JOIN开始Table_A提取EmpId权限MemId来更新您的记录。