我有以下触发器:
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列添加索引吗?
答案 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
我真的怀疑这会表现得更好。