2012-12-24 30 views
6

Vì một số lý do tôi không thể tìm thấy câu trả lời chính xác mà tôi cần. Tôi đã tìm kiếm trong 20 phút qua tại đây.INSERT giá trị đã xóa vào bảng trước DELETE với DELETE TRIGGER

Tôi biết nó đơn giản. Rất đơn giản. Nhưng tôi không thể bắn cò vì một lý do ..

Tôi có một bảng với hai cột

dbo.HashTags

|__Id_|_name_| 
| 1 | Love | 

Tôi muốn chèn các giá trị bị xóa vào bảng khác được gọi là dbo.HashTagsArchive theo truy vấn DELETE.

Ví dụ:

DELETE FROM [dbo].[HashTags] WHERE Id=1 

Sau ví dụ này tôi nên có hàng xóa trong dbo.HashTagsArchive và hàng với Id=1 nên bị xóa trong dbo.HashTags

tôi đã cố gắng TRIGGER này:

ALTER TRIGGER [dbo].[HashTags_BeforeDelete] 
    ON [dbo].[HashTags] 
    FOR DELETE 
AS 
    BEGIN 
    INSERT INTO HashTagsArchive 
    (Id, 
    HashTagId, 
    delete_date) 
    SELECT d.Id, m.HashTagId,GETUTCDATE() FROM deleted d 
    JOIN dbo.HashTags m ON m.Id=d.Id 
    DELETE FROM dbo.HashTags 
    WHERE ID IN(SELECT deleted.Id FROM deleted) 
    END 
GO 

Nó nhận được Deleted nhưng không có Inserted hàng trong số HashTagsArchive

Trả lời

12

Sự cố của bạn là: kích hoạt này kích hoạt SAU xóa đã xảy ra. Vì vậy, không còn hàng nào trong số HashTags mà bạn có thể tham gia!

Bạn cần phải sử dụng kích hoạt này để thay thế:

ALTER TRIGGER [dbo].[HashTags_BeforeDelete] 
    ON [dbo].[HashTags] 
    FOR DELETE 
AS 
    BEGIN 
    INSERT INTO HashTagsArchive(Id, HashTagId, delete_date) 
     SELECT 
      d.Id, d.HashTagId, GETUTCDATE() 
     FROM deleted d 
    END 
GO 

Bảng pseudo Deleted chứa toàn bộ row (s) rằng đã bị xóa - không cần phải tham gia vào bất cứ điều gì ...

Cũng : kích hoạt này kích hoạt sau khi xóa đã xảy ra - vì vậy bạn không cần phải làm bất cứ điều gì cho mình, bên trong trình kích hoạt - chỉ cần chèn các bit thông tin đó vào bảng lưu trữ của bạn - đó là tất cả. Mọi thứ khác được xử lý bởi SQL Server cho bạn.

+0

Cảm ơn! Hoạt động hoàn hảo! – Ofear

Các vấn đề liên quan