2012-11-14 14 views
6

Mam poniżej wyzwalacza:SQL Server - Po Insert/Dla Insert - Wycofanie

CREATE Trigger instructor_expertise on CourseSections 
    After Insert 
    As Begin 
    ...... 

    If (Not Exists(Select AreaName From AreasOfInstructor Where (InstructorNo = @InstructorNo AND AreaName = @AreaName))) 
    Begin 
    RAISERROR('Course not in instructors expertise', 16, 1) 
    rollback transaction 
    End 
    GO 

Moje pytanie brzmi, czy 'wycofywania transakcji' usunąć wiersz? Co, jeśli zamiast tego jest "Wstaw", czy "wycofanie transakcji" usuwa wiersz w takim przypadku?

Dzięki!

+0

@MitchWheat: transakcja zawsze będzie istnieć - nie? Jednoznacznie lub niejawnie. A wycofanie spowoduje zakończenie tej transakcji i cofnie wszystko, co transakcja ta próbowała zrobić z tabelą. –

+1

Tak, przepraszam Marc, zgadza się. Miałem na myśli wyraźną transakcję. Myślę, że mogłem zabrudzić wodę ... Usuwam poprzedni komentarz. –

+0

Skąd pochodzą wartości "@ InstructorNo' i" @ AreaName' od ?? Zasadniczo, jeśli wywołasz 'ROLLBACK TRANSACTION' w twoim spustu, ** zatrzymasz i przerwiesz ** swój' WSTAW 'i żadne wiersze nie będą wstawiane w ogóle –

Odpowiedz

13

Twój INSERT oświadczenie zawsze przebiega w transakcji - albo masz wyraźnie zdefiniowany jeden, lub jeśli nie , a następnie SQL Server użyje niejawnej transakcji.

Wstawiasz jeden (lub wiele) wiersz do swojej tabeli. Następnie - nadal w ramach transakcji - wyzwalacz AFTER INSERT uruchamia i sprawdza określone warunki - zwykle za pomocą pseudo tabeli Inserted dostępnej wewnątrz wyzwalacza, która zawiera wiersze, które zostały wstawione.

Jeśli zadzwonisz ROLLBACK TRANSACTION w spuście, to tak - transakcja, wszystko to robi, jest wycofana i to tak, jakby nigdy że INSERT stało - nic nie pokazuje się w tabeli bazy danych.

również: FOR INSERT jest taka sama jak AFTER INSERT w SQL Server - spust jest wykonywany po oświadczenie INSERT wykonała swoje zadanie.

Jedną rzeczą, aby pamiętać, (który dużo programistów dostać źle): spust jest zwolniony raz na partię - NIE raz z rzędu! Więc jeśli wstawisz 20 wierszy naraz, wyzwalacz zostanie uruchomiony raz, a pseudo tabela Inserted wewnątrz wyzwalacza zawiera 20 wierszy. Musisz wziąć to pod uwagę przy pisaniu spustu - jesteś nie zawsze zajmuje tylko jeden wiersz włożony!

+1

+1. Specjalnie dla kawałka partii! :) –

0

nie to nie jest możliwe, ponieważ kiedy ich nie ma wiersz istnieje wtedy będzie go rozpocząć w bloku ...

+1

dzięki za odpowiedź! Jak powinienem zatem zapobiec dodawaniu wiersza? – zoe