SQL 服务器触发器验证以插入或更新

SQL Server trigger validation to insert or update

我必须为包含两列 Article_C(主键)和 Status_CChange_Table 开发多值更新触发器。当 Status_C 列更新时触发器激活,它需要插入或更新 Target_Table 列是 Article_T(主键)和 Status_T.

两个 table 的状态列都是 NOT NULL int

对于 insert 验证:将不存在的所有 Change_Table 值(文章和状态)插入 Target_Table

对于update条件:如果文章存在于Target_Table,将更新后的状态值传递给table。

状态值为 1 或 2。

我当前的实现:

CREATE TRIGGER [dbo].[Article_Trigger] 
ON [dbo].[Change_Table]
AFTER UPDATE 
NOT FOR REPLICATION 
AS
    IF UPDATE (Status_C)
    BEGIN
        INSERT INTO Target_Table (Article_T, Status_T)
            SELECT Article_C, Status_C
            FROM Change_Table
            WHERE NOT EXISTS (SELECT * FROM Target_Table 
                              WHERE Change_Table.Article_C = Target_Table.Article_T 
                                AND Change_Table.Status_C = Target_Table.Status_T)
    END

这是插入的粗略想法,但它仅在 Change_Table 首次更新且目标 table 为空时起作用一次。之后,由于插入条件,在第二次更新状态后,由于主键重复,我收到错误“违反 PRIMARY KEY 约束”。

第二次执行后出错的查询:

update Change_Table set status_c = 1 where Article_C in (1000,1003)

我如何修改这个查询来实现这个触发器的更新状态条件?

我认为您可以使用 deletedinserted table。这 2 个虚拟 tables 与触发器配合得很好。在您的示例中,您可能不需要 deleted table,因为您没有记录历史更改。

CREATE TRIGGER [dbo].[Article_Trigger] 
ON [dbo].[Change_Table]
AFTER UPDATE 
NOT FOR REPLICATION 
AS
    IF UPDATE (Status_C)
    BEGIN

        --insert if not exist
       
        INSERT INTO Target_Table
        SELECT A.Article_C, A.Status_C
        FROM inserted as A --the updated records from the source table will exist in the inserted virtual table
        LEFT JOIN  Target_Table as B
        ON B.Article_T = A.Article_C
        WHERE B.Article_T IS NULL

        --update if exist
       
        UPDATE A
        SET A.Status_T = B.Article_C
        FROM Target_Table as A
        INNER JOIN  inserted as B   --the updated records from the source table will exist in the inserted virtual table
        ON B.Article_C = A.Article_T

    END