2017-08-08 154 views
2

我是新來的觸發器,但我很難理解,如果我在這裏採取正確的做法。刪除SQL Server觸發器 - 哪些記錄在刪除表中?

我正在使用SQL Server 2016.我有2個表,TeamsTeamMembersTeams是父表,TeamMembers是孩子,使用Teams.TeamID作爲外鍵。

我也有一個Activities表記錄任何創建或更新我的任何表。該表格有一個TableName文本列以及一個IdRow列,該列引用了創建或更新的行的ID。我還有一個JSONChanges列,其中包含該活動日誌項目中更改的JSON字符串。

所以在表格上每個Activity只有1條記錄。但是每個記錄可能會執行許多活動。

所以,當用戶刪除一個團隊,我不僅要刪除所有記錄的那支球隊和那支球隊的小組成員(這是很容易我Team_Delete存儲過程中做)的Activities的,但我也想要刪除我的Activities表中TeamMembers上活動的任何記錄。由於Activities表的IdRow列點在TeamMembers表中的列中,因此我無法使用刪除存儲過程中的TeamID

我的想法是在TeamMembers表上創建一個刪除觸發器。

每當TeamMember被刪除時,我可以刪除指向已刪除記錄的Activities日誌中的所有記錄。這將簡化我的Team_DELETE存儲過程。我認爲。

我所遇到的困惑與在任何給定時間將在刪除表中的記錄有關。如果用戶A刪除了TeamMember,並且同時用戶B在另一個Team Member上運行了更新,那麼刪除的表中是否有2條記錄?如果我根據刪除表中的內容刪除活動表中的所有記錄,那麼我將刪除不應刪除的記錄。對?

另一個問題是我該如何挑選一條記錄來刪除?我如何知道刪除表中的哪個記錄是我想要觸發的那個記錄?

+1

歡迎所以!看看這篇文章,這將幫助你以更可能被回答的方式來優化你的問題。 –

+1

刪除表中的唯一記錄是在單個批次中刪除的記錄。如果多行被刪除,那麼刪除的表將包含所有被刪除的記錄。您可以將已刪除的表格加入其他表格中,以確定還應該刪除其他內容。看看這篇文章展示瞭如何限制刪除和更新連接。 http://www.tech-recipes.com/rx/56823/delete-update-rows-using-inner-join-sql-server/ – Jeremy

+0

你是否用你的表格之間的外鍵強制引用完整性(這好像是一種情況你應該在哪裏)?如果是這樣,你可以添加'在刪除級聯'和SQL服務器將爲您處理這些刪除,不需要觸發器。 – Greenspark

回答

0

如果我不得不使用上TeamMembers觸發器,我會嘗試:

CREATE TRIGGER [ schema_name .]DeleteTeamMemberActivities ON [ schema_name .]TeamMembers 
AFTER DELETE 
AS 
DELETE 
FROM 
    Activities a 
    INNER JOIN DELETED d ON d.TeamMemberID = a.IdRow AND a.TableName ='TeamMembers'; 

我也將使用級聯的團隊和TeamMembers之間的外鍵關係刪除。

[編輯2017年8月9日12:45修正a.TableName加入]

+0

這就是我一直在尋找的。謝謝! –

0

僅供參考,我編輯cclarke的代碼一點點 - 這是我結束了:

CREATE TRIGGER TRIGGER_DeleteTeamMemberActivities ON TeamMembers 
AFTER DELETE 
AS 
DELETE a 
FROM 
    Activities a 
    INNER JOIN deleted d ON d.TeamMemberID = a.IDRow AND a.TableName 
    ='TeamMembers';