niedziela, 15 stycznia 2012

T-SQL od podstaw cz. 1

Postanowiłem sobie, że w tym roku będę blogował znacznie częściej niż miało to miejsce dotychczas. Jako, że w ostatnim czasie dość sporo czasu spędzam pomagając innym z SQL-em to postanowiłem, że będę pisał trochę praktycznych porad.

Transakcje w T-SQL

Czy zdarzyło się wam kiedyś odpalić jakieś zapytanie aktualizujące tabelę, które przez przypadek zaktualizowało więcej rekordów niż tego oczekiwaliście?

Nie jest to częsty problem ale pewnie każdemu się to kiedyś zdarzyło. W ostatnim czasie miałem przyjemność przywracania fragmentu bazy danych, która została zmieniona przez UPDATE bez klauzuli WHERE. Jednym słowem cała tabela została zaktualizowana i trzeba było ją odtworzyć z innego źródła. W moim przypadku, skopiowałem dane z innej bazy, która zawierała tą samą tabelę.

Problemu by nie było gdyby
· Zapytanie miało poprawną klauzulę WHERE
· Byłoby uruchomione wewnątrz transakcji.

Zawsze zalecam zagnieżdżanie zapytań aktualizujących dane wewnątrz transakcji. Zapytanie jest wtedy wykonywane w trzech krokach.
1. Otwarcie transakcji i zapytanie DML.
2. Sprawdzenie rezultatu
3. Zatwierdzenie lub cofnięcie transakcji w przypadku gdy liczba wierszy zaktualizowanych nie odpowiada oczekiwaniom.

W praktyce wygląda to następująco
   1: begin tran
   2: update aspnet_Roles
   3: set Description = 'System administrators'
   4: where RoleName = 'Admins'
Po wykonaniu powyższego w oknie Messages sprawdzam ilość wierszy, które zostały zaktualizowane i jeżeli jest to 1, czyli tyle ile oczekuję to zatwierdzam transakcję poleceniem
   1: commit tran
W przypadku gdyby rezultat byłby inny to cofam transakcję poleceniem
   1: rollback tran
Zweryfikować rezultat można także poprzez wykonanie zapytanie SELECT w tym samej sesji, bądź SELECT z hintem NOLOCK w dowolnej innej sesji.

Prześlij komentarz