触发从表中删除存在的记录



我有以下表和表employee_assignment_future,它们具有相同的列。

CREATE TABLE dbo.employee_assignment (
employee_id BIGINT,
department_id BIGINT,
job_title_id BIGINT,
manager_id BIGINT,
effective_start_date SMALLDATETIME,
effective_end_date SMALLDATETIME,
action_code VARCHAR(60)
);

我需要一个触发器,当employee_assignment的记录更新时,检查employee_assignment_future中是否存在employee_iddepartment_id以及job_title_idmanager_id,如果是这样,则从employee_assignment_future中删除它。这四个id是外键。

我想到了这样的东西:

CREATE OR ALTER TRIGGER t_v_employee_assignment_update3 on employee_assignment
AFTER UPDATE
AS
BEGIN           
DECLARE @emp_id BIGINT = (SELECT employee_id from inserted)
DECLARE @dep_id BIGINT = (SELECT department_id from inserted)
DECLARE @job_id BIGINT = (SELECT job_title_id from inserted)
DECLARE @man_id BIGINT = (SELECT manager_id from inserted)

DELETE FROM employee_assignment_future
WHERE @emp_id = employee_assignment_future.employee_id 
AND @dep_id = employee_assignment_future.department_id
AND @job_id = employee_assignment_future.job_title_id
AND @man_id = employee_assignment_future.manager_id
END;
SELECT * FROM employee_assignment_future
SELECT * FROM employee_assignment
UPDATE employee_assignment
SET employee_id = 4, department_id = 2, job_title_id = 8, manager_id = 3, effective_start_date ='2019-11-13 00:00:00', effective_end_date = NULL, action_code = NULL
WHERE employee_id = 64;

但是,它没有从employee_assignment_future中删除任何内容,也没有在employee_assignment中更新任何内容。

一个简单的DELETE+JOIN应该可以检测记录是否存在,然后可以删除。

下面的删除可以是触发器的整个主体。

DELETE F
FROM employee_assignment_future F
INNER JOIN Inserted I
ON I.employee_id = F.employee_id 
AND I.department_id = F.department_id
AND I.job_title_id = F.job_title_id
AND I.manager_id = F.manager_id;

注意:你不能假设Inserted(或Deleted)只有一行。你需要使用基于集合的操作,并处理它有0-N行。

最新更新