代码之家  ›  专栏  ›  技术社区  ›  TheCloudlessSky

用于更新同一表中多个列的SQL Server删除触发器

  •  2
  • TheCloudlessSky  · 技术社区  · 14 年前

    我有以下触发器:

    CREATE TRIGGER Users_Delete
       ON  Users 
       AFTER DELETE
    AS 
    BEGIN
    
        SET NOCOUNT ON;
    
        -- Patients
        UPDATE Patients SET ModifiedByID=NULL WHERE ModifiedByID=ID;
        UPDATE Patients SET CreatedByID=NULL WHERE CreatedByID=ID;
        UPDATE Patients SET DeletedByID=NULL WHERE DeletedByID=ID;
    
    END
    

    我想知道是否有一种方法可以将这三个更新语句“组合”成如下内容:

    UPDATE Patients SET 
    (ModifiedByID=NULL WHERE ModifiedByID=ID) OR 
    (CreatedByID=NULL WHERE CreatedByID=ID) OR 
    (DeletedByID=NULL WHERE DeletedByID=ID);
    

    我真的希望只有一个声明来提高性能。

    我使用触发器的原因是 ON DELETE 对于 FOREIGN KEY 是因为我犯了一个以上的错误 关于删除 导致以下错误:

    引入外键约束'fk_patients_users_deleted'on table'patients'may 导致循环或多个级联路径。指定“删除时不执行任何操作”或“更新时不执行” 操作,或修改其他外键约束。

    编辑:在所有modifiedbyid、createdbyid和deletedbyid列上都有索引好吗?删除一个用户当然是很少见的,那么是否值得在3列中添加索引呢?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Yellowfog    14 年前

    像这样?

    UPDATE Patients SET 
    ModifiedByID = CASE WHEN ModifiedByID=ID THEN Null ELSE ModifiedById END,
    CreatedByID = CASE WHEN CreatedByID=ID THEN Null ELSE CreatedById END,
    DeletedByID = CASE WHEN DeletedByID=ID THEN Null ELSE DeletedById END
    WHERE (ModifiedByID = ID OR CreatedByID = ID OR DeletedByID = ID)
    
        2
  •  2
  •   Martin Smith    14 年前

    关于你最初的问题。

    不是真的。我想不出比这更好的办法了

    UPDATE Patients 
    SET ModifiedByID= CASE WHEN ModifiedByID=ID THEN NULL ELSE ModifiedByID END,
    CreatedByID= CASE WHEN CreatedByID=ID THEN NULL ELSE CreatedByID END,
    DeletedByID= CASE WHEN DeletedByID=ID THEN NULL ELSE DeletedByID END
    WHERE
    ModifiedByID  IN (SELECT ID FROM DELETED)
    OR 
    CreatedByID  IN (SELECT ID FROM DELETED)
    OR
    DeletedByID  IN (SELECT ID FROM DELETED)
    

    请注意,这将正确处理多行删除。目前还不清楚你发布的信息中是否有你当前的触发器。

        3
  •  1
  •   Tom H    14 年前

    您可以在一个语句中完成,但这不一定对性能更好。

    UPDATE
        Patients
    SET
        ModifiedByID = CASE WHEN ModifiedID = ID THEN NULL ELSE ModifiedID,
        CreatedByID = CASE WHEN CreatedByID = ID THEN NULL ELSE CreatedByID,
        DeletedByID = CASE WHEN DeletedByID = ID THEN NULL ELSE DeletedByID
    

    不过,我真的怀疑这是否会有更好的效果。