[英]SQL Server Delete Trigger To Update Multiple Columns in Same Table
我有以下觸發器:
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);
我真的只想發表一條聲明來提高性能。
我FOREIGN KEY
ON DELETE
上使用觸發器代替的原因是因為我收到一個錯誤,即具有多個ON DELETE
會導致以下錯誤:
在表“患者”上引入外鍵約束“ FK_Patients_Users_Deleted”可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。
編輯:在所有ModifiedByID,CreatedByID,DeletedByID列上都有索引會很好嗎? 刪除用戶當然是很少見的,所以值得將索引添加到3列嗎?
關於您的原始問題。
並不是的。 我沒有比這更好的了
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)
請注意,這可以正確處理多行刪除。 從您發布的內容尚不清楚當前觸發器是否起作用。
像這樣嗎
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)
您可以在一個語句中做到這一點,但這並不一定會提高性能。
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
我真的懷疑這樣做是否會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.