我是新來的觸發器,但我很難理解,如果我在這裏採取正確的做法。刪除SQL Server觸發器 - 哪些記錄在刪除表中?
我正在使用SQL Server 2016.我有2個表,Teams
和TeamMembers
。 Teams
是父表,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條記錄?如果我根據刪除表中的內容刪除活動表中的所有記錄,那麼我將刪除不應刪除的記錄。對?
另一個問題是我該如何挑選一條記錄來刪除?我如何知道刪除表中的哪個記錄是我想要觸發的那個記錄?
歡迎所以!看看這篇文章,這將幫助你以更可能被回答的方式來優化你的問題。 –
刪除表中的唯一記錄是在單個批次中刪除的記錄。如果多行被刪除,那麼刪除的表將包含所有被刪除的記錄。您可以將已刪除的表格加入其他表格中,以確定還應該刪除其他內容。看看這篇文章展示瞭如何限制刪除和更新連接。 http://www.tech-recipes.com/rx/56823/delete-update-rows-using-inner-join-sql-server/ – Jeremy
你是否用你的表格之間的外鍵強制引用完整性(這好像是一種情況你應該在哪裏)?如果是這樣,你可以添加'在刪除級聯'和SQL服務器將爲您處理這些刪除,不需要觸發器。 – Greenspark