触发以从表中删除记录,如果它存在

发布于 2025-01-24 11:26:20 字数 1722 浏览 3 评论 0原文

我有下表和表lightee_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_iddepastion_idjob_title_id and manager_id lightsee_assignment_future /code>每当来自雇员_assignment的记录被更新时,如果是这样,则从lightsee_assignment_future将其删除。这4个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中删除任何内容,也没有在雇用> lightsee_assignment中更新任何内容。

I have the following table and table employee_assignment_future, which has the same columns.

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)
);

I need a trigger that checks if a employee_id and department_id and job_title_id and manager_id exists in employee_assignment_future whenever the record from employee_assignment is UPDATED, and if so to delete it from employee_assignment_future. These 4 id's are foreign keys.

I came up with something like this:

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;

However, it's not deleting anything from employee_assignment_future, and not updating anything in employee_assignment.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ペ泪落弦音 2025-01-31 11:26:20

简单的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;

注意:您不能假设插入(或已删除)只有一个行。您需要使用基于设置的操作并具有0-N行的处理。

A simple DELETE + JOIN should detect whether the record exists in the future and can then be deleted.

The following delete can be the entire body of your trigger.

    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;

Note: You can't assume Inserted (or Deleted) have only a single row. You need to use set based operations and handle it having 0-N rows.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文