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

时间:2010-06-23 15:52:23

标签: sql sql-server triggers

我有以下触发器:

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语句“组合”成如下所示:

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

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

我在ON DELETE FOREIGN KEY上使用触发器的原因是因为我收到的错误导致多个ON DELETE导致以下错误:

  

在表'患者'上引入FOREIGN KEY约束'FK_Patients_Users_Deleted'可能   导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO   ACTION,或修改其他FOREIGN KEY约束。

编辑:在所有ModifiedByID,CreatedByID,DeletedByID列上都有索引会好吗?删除用户当然很少见,所以值得为3列添加索引吗?

3 个答案:

答案 0 :(得分:2)

关于你原来的问题。

不是真的。我无法想出比

更好的东西
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)

请注意,这会正确处理多行删除。目前尚不清楚您发布的当前触发器是什么。

答案 1 :(得分:1)

这样的东西?

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 :(得分:1)

你可以在一个声明中做到这一点,但这不一定对性能更好。

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

我真的怀疑这会表现得更好。