Chcę utworzyć wyzwalacz przed usunięciem. Kiedy usuwam rekord z tabeli, to rekord musi zostać wstawiony do tabeli historii. Jak mogę to zrobić w SQL Server?Jak utworzyć wyzwalacz przed usunięciem w programie SQL Server?
Odpowiedz
W tej sytuacji prawdopodobnie lepiej wykonać regularne wyzwalanie "po". Jest to najbardziej powszechne podejście do tego typu sytuacji.
Coś
CREATE TRIGGER TRG_AUD_DEL
ON yourTable
FOR DELETE
AS
INSERT INTO my_audit_table (col1, col2, ...)
SELECT col1, col2...
FROM DELETED
Co stanie się to, gdy rekord (lub rekordy!) Są usuwane z tabeli, usunięty wiersz zostanie wstawiony my_audit_table
Stół DELETED
jest stół wirtualny, który zawiera rekord (y), które były tuż przed usunięciem.
Należy również pamiętać, że wyzwalacz działa jako część niejawnej transakcji na wyciągu kasowania, więc jeśli usuwanie nie powiedzie się i wycofa, wyzwalacz również zostanie wycofany.
Można również użyć INSTEAD OF DELETE
CREATE TRIGGER dbo.SomeTableYouWhatToDeleteFrom
ON dbo.YourTable
INSTEAD OF DELETE
AS
BEGIN
-- Some code you want to do before delete
DELETE YourTable
FROM DELETED D
INNER JOIN dbo.YourTable T ON T.PK_1 = D.PK_1
END
INSTEAD OF DELETE nie może być użyty, ponieważ mam kasowanie kasowania włączone na stole. – user1374263
FWIW, możesz zmienić wszystkie kaskadowe usuwanie obcych kluczy na zwykłe obce klucze i przetwarzać usunięcia z tego wyzwalacza, które w jednym miejscu usuwają wszystko, co działo się w wyniku usunięcia. – Tony
To może być wykonane w następujących czynności dla powiedzmy w tym przykładzie używam tabeli klientów:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
Tworzenie Historia:
CREATE TABLE CUSTOMERS_HIST( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25) , LAST_UPDATED DATETIME, PRIMARY KEY (ID) );
Wyzwalanie tabeli źródłowej jak poniżej na Usuń wydarzenie:
CREATE TRIGGER TRG_CUSTOMERS_DEL ON CUSTOMERS FOR DELETE AS INSERT INTO CUSTOMERS_HIST (ID, NAME, AGE, ADDRESS, LAST_UPDATED) SELECT ID, NAME, AGE, ADDRESS, LAST_UPDATED FROM DELETED
- 1. Utwórz wyzwalacz w SQL Server
- 2. SQL Server Update wyzwalacz, Pobierz pól przed i po aktualizowane
- 3. Wyzwalacz SQL Server Update: jak to zrobić
- 4. Wyzwalacz SQL Server - Wyślij wiadomość do kolejki
- 5. Jak utworzyć wyzwalacz MySQL w phpmyadmin
- 6. Chroń element DIV przed usunięciem w TinyMCE
- 7. jQuery efekt kulminacyjnym przed usunięciem()
- 8. NHibernate aktualizuje wiersz przed usunięciem?
- 9. Jak zabezpieczyć stos AWS CloudFormation przed usunięciem?
- 10. Jak utworzyć złożony klucz podstawowy w SQL Server 2008
- 11. Zmień nazwę ograniczenia w programie SQL Server?
- 12. Łączy ntext w programie SQL Server 2005
- 13. Jak utworzyć tabelę systemową SQL Server
- 14. Jak utworzyć bazę danych ELMAH SQL Server?
- 15. Wyzwalacz MySQL przed Wstaw wartość Sprawdzanie
- 16. warunkowo utworzyć użytkownika w SQL Server
- 17. SQL Server 2008 - Pomoc pisania prostych wyzwalacz INSERT
- 18. Jak uzyskać wartości parametrów dla zapytania SQL Server w programie SQL Server Profiler
- 19. Jak zaktualizować przesunięcie kolumny w programie SQL Server?
- 20. Jak profilować jedną tabelę w programie SQL Server?
- 21. Jak wyszukiwać nazwy za pomocą apostrofu w programie SQL Server?
- 22. Jak wygenerować liczbę bezpieczną kryptograficznie w programie SQL Server?
- 23. Ustawienie wskaźnika na wartość NULL przed usunięciem
- 24. Jak wybrać indeks klastrowany w SQL Server?
- 25. Czy wyzwalacze zostaną wycofane, jeśli transakcja zakończy się niepowodzeniem w programie SQL Server?
- 26. Konwertuj datę na znaczniki w programie SQL Server
- 27. Jak sprawdzić, czy element zawiera kod HTML przed usunięciem? jQuery
- 28. Jak utworzyć migawkę bazy danych w programie SQL Server za pomocą interfejsu GUI systemu SSMS, a nie kodu SQL
- 29. Sortowanie kolumny przed różnymi sortowaniami w SQL Server
- 30. Jak utworzyć unikalne ograniczenie złożone w SQL Server 2005?
Dzięki za odpowiedź, to działa dobrze – user1374263
Stwierdzając, że dla wycofywania pracować nad błędem, że blok try/catch mogą być potrzebne w ciągu wyzwalacz [(przykład)] (http://dba.stackexchange.com/questions/57909) prawdopodobnie zależy od przyczyny błędu. – crokusek
Dobrze, ale pamiętaj, że dotyczy tylko RAISEERROR. Regularny błąd zakończenia instrukcji (np. Naruszenie PK itp.) Spowoduje wycofanie transakcji niejawnej z rozpoczęciem poza wyzwalaczem. –