Wycofywanie zmian i zatwierdzenia procedur przechowywanych i wyzwalaczy

Wykonywanie transakcji ROLLBACK lub ZATWIERDZIĆ transakcji Transact-SQL instrukcja procedura składowana lub wyzwalacz jest możliwe, ale tak robić może powodować błędy.

W procedurach przechowywanych

Jeśli po zakończeniu procedura składowana, niż miał podczas procedury została wykonana, @@ TRANCOUNT ma inną wartość, wystąpi błąd informacyjna (266).Może się to zdarzyć na dwa sposoby:

  • procedura składowana jest wywołana z @@ TRANCOUNT 1 lub większy i transakcji ROLLBACK wykonuje procedura składowana instrukcja.Dekrementuje @@ TRANCOUNT 0 i powoduje błąd 266 po zakończeniu procedura składowana.

  • procedura składowana jest wywołana z @@ TRANCOUNT 1 lub większy i ZATWIERDZIĆ transakcji wykonuje procedura składowana instrukcja.Dekrementuje @@ TRANCOUNT 1 i powoduje błąd 266 po zakończeniu procedura składowana.Jednak jeśli instrukcji BEGIN TRANSACTION jest wykonywany po zatwierdzeniu transakcji, błąd nie występuje.

W wyzwalaczy

Wyzwalacz działa tak, jakby obowiązywały oczekujących transakcji podczas wykonywania wyzwalacza.Jest to prawdą czy instrukcja wyzwalania wyzwalacz jest niejawny lub transakcja jawna.

Po uruchomieniu instrukcja wykonywanych tryb autozatwierdzania wynosi jest wprost rozpocząć TRANSAKCJĘ do umożliwienia odzyskiwanie wszystkich modyfikacji, jeśli napotkaniu błędu wygenerowany przez instrukcję.Oznaczało to, że transakcja nie ma wpływu na inne instrukcje w partia, ponieważ jest ono popełnione lub wycofywany po zakończeniu instrukcja.Oznaczało to, że transakcja jest nadal obowiązują, jednak po wywołaniu wyzwalacza.

Gdy uruchamia wyzwalacz, transakcja niejawna jest uruchomiona.Jeśli wyzwalacz kończy wykonywanie i @@ TRANCOUNT = 0, wystąpi błąd 3609 oraz partia jest zakończony.Jeśli instrukcja instrukcji BEGIN TRANSACTION jest wystawiony w wyzwalacz, tworzy transakcji zagnieżdżonych.W tej sytuacji podczas wykonywania instrukcja ZATWIERDZIĆ transakcji sprawozdania będą dotyczyć tylko transakcji zagnieżdżonych.

Używając w wyzwalacz TRANSAKCJĘ ROLLBACK, należy pamiętać o następujących zasadach:

  • Wszystkie zmiany danych dokonane że punktu w bieżącej transakcji są przywracane, tym, które zostały wprowadzone przez wyzwalacz.

  • Wyzwalacz kontynuuje wykonywanie wszelkich pozostałych oświadczenia po instrukcja WYCOFYWANIA.Jeśli dowolne z tych oświadczeń modyfikowania danych modyfikacje są nie przywracane.

  • WYCOFANIE w wyzwalacz zamyka i zwalnia wszystkie kursory, które zostały zgłoszone i otwarty w partia zawierających instrukcja , opalane wyzwalacza.Obejmuje to kursory zgłoszone i otwarty w procedurach przechowywanych przez partia, która opalane wyzwalacza.Kursory zadeklarowane w partia przed partia, który wyzwalacz opalane tylko są zamknięte.Jednakże pozostaną otwarte kursory STATYCZNE lub INSENSITIVE jeżeli:

    • CURSOR_CLOSE_ON_COMMIT jest zestaw OFF.

    • kursor statyczny jest synchroniczna lub całkowicie wypełniona kursor asynchronicznego.

Zamiast transakcji ROLLBACK można instrukcja transakcji ZAPISZ wykonać częściowe wycofywania w wyzwalacza.