![](/img/trans.png)
[英]SQL Server : using information from one table to delete rows in another
[英]Delete rows from SQL Server database by using BETWEEN condition just delete one record (the last one in range)
例如,我有一個包含這些記錄的表Date
(請參見屏幕截圖):
該表的列DLT
類型為bit
(布爾),默認為0(false)。
我為此表創建了一個“ Instead of delete
觸發器,當我刪除一行時,它並不會真正刪除,而是將DLT
列的值更改為1(真)。
ALTER TRIGGER [dbo].[TrgDltDate]
ON [dbo].[Date]
INSTEAD OF DELETE
AS
BEGIN
DECLARE @DeletedID INT
SELECT @DeletedID = deleted.DateID
FROM deleted
UPDATE dbo.Date
SET DLT = 1, LastModificationDate = GETDATE()
WHERE DateID = @DeletedID
END
當我使用“ BETWEEN”條件刪除(將“ DLT”列的值更改為1)時,某些記錄僅刪除(將“ DLT”列的值更改為1)范圍內的最后一條記錄,例如:
DELETE FROM dbo.Date
WHERE DateID BETWEEN 2 AND 6
它只是為DateID = 6的記錄刪除(將“ DLT”列值更改為1),但是當我禁用該觸發器( Instead of delete
)時,“ Between”可以正常工作。 怎么了 ? TNX。
您的觸發器僅更改一行。 在SQL Server中,觸發器是集合操作,因此您應將其視為集合:
ALTER TRIGGER [dbo].[TrgDltDate] ON [dbo].[Date] INSTEAD OF DELETE
AS
BEGIN
UPDATE dbo.Date
SET DLT = 1,
LastModificationDate = GETDATE()
WHERE DateID IN (SELECT d.DateID FROM Deleted d)
END;
也就是說,所有要刪除的行都將傳遞到觸發器中的deleted
“表”(實際上是偽表)中。 您想刪除所有的對象,而不僅僅是一個,所以不能將id存儲在變量中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.