2012-12-24 15 views
6

Z jakiegoś powodu nie mogę znaleźć dokładnej odpowiedzi, której potrzebuję. Szukałem tu w ciągu ostatnich 20 minut.WSTAWIĆ usunięte wartości do tabeli przed USUŃ z DELETE TRIGGER

Wiem, że to proste. Bardzo prosta. Ale nie mogę zwolnić spust z jakiegoś powodu ..

Mam tabeli z dwoma kolumnami

dbo.HashTags

|__Id_|_name_| 
| 1 | Love | 

chcę wstawić usunięte wartości w innej tabeli o nazwie dbo.HashTagsArchive w zapytaniu DELETE.

przykład:

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

Po tym przykładzie należy mieć usuniętą wiersz dbo.HashTagsArchive i rząd z Id=1 powinien być usunięty dbo.HashTags

że próbuje to za sobą:

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 

Dostaje Deleted ale nie Inserted wiersz w

Odpowiedz

12

Twój problem: ten wyzwalacz odpala PO usunięcie już się stało. Więc nie ma już wiersza w HashTags, do którego możesz dołączyć!

Musisz użyć tego spust zamiast:

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 

Deleted pseudo tabela zawiera cały wiersz (y), które zostały usunięte - nie ma potrzeby, aby przyłączyć się na niczym ...

także : ten wyzwalacz uruchamia się po usunięciu - więc nie musisz nic robić samodzielnie, wewnątrz wyzwalacza - po prostu wstaw te bity informacji do tabeli archiwum - to wszystko. Cała reszta jest obsługiwana przez SQL Server.

+0

Dzięki! Działa idealnie! – Ofear

Powiązane problemy