【发布时间】:2010-06-23 15:52:22
【问题描述】:
我有以下触发器:
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 会导致以下错误:
在表“Patients”上引入 FOREIGN KEY 约束“FK_Patients_Users_Deleted”可能 导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
编辑:在所有 ModifiedByID、CreatedByID、DeletedByID 列上都有索引会更好吗?删除用户当然很少见,那么是否值得为 3 列添加索引?
【问题讨论】:
-
令我困扰的是,您完全改变了这些数据。停用用户比删除具有关联的子记录的用户要好。现在您将无法分辨谁创建了该记录,这可能具有一定的重要性,尤其是当用户因性能原因被解雇时。
-
这实际上是一个非常有效的观点。我会考虑到这一点。
标签: sql sql-server triggers