| Termin | Definicja |
|---|---|
| Transakcje w funkcjach | Transakcje w funkcjach są ograniczone — funkcje skalarne i tabelaryczne nie mogą samodzielnie modyfikować danych. Zakres transakcyjności funkcji w SQL ServerW SQL Server funkcja użytkownika, czyli User-Defined Function (UDF), służy do obliczania wartości albo zwracania zestawu wierszy. Może być wywołana między innymi w instrukcji Ograniczenie wynika z modelu wykonywania funkcji. Funkcja jest częścią instrukcji, która ją wywołuje, dlatego działa w kontekście transakcji ustanowionym przez wywołującego. Jeżeli funkcja zostanie użyta w instrukcji wykonywanej wewnątrz jawnie rozpoczętej transakcji, jej odczyty uczestniczą w tej samej transakcji. Jeżeli instrukcja nie została objęta osobnym blokiem transakcyjnym, funkcja nie tworzy własnego, autonomicznego obszaru zapisu. SQL Server nie udostępnia w funkcjach odpowiednika autonomicznych transakcji znanych z niektórych innych systemów baz danych. Instrukcje niedozwolone wewnątrz funkcjiFunkcja T-SQL nie może wykonywać operacji, których skutkiem byłaby trwała zmiana danych znajdujących się poza jej własnym zakresem obliczeń. W praktyce oznacza to zakaz używania w funkcji instrukcji Ograniczenia obejmują także mechanizmy proceduralne, które mogłyby wywołać skutki uboczne. W funkcjach T-SQL nie używa się dynamicznego SQL wykonywanego przez Funkcja a procedura składowanaRóżnica między funkcją a procedurą składowaną jest istotna przy projektowaniu przepływu danych. Funkcja może zostać użyta jako element wyrażenia lub źródło danych w zapytaniu. Musi zwrócić wartość skalarną albo wynik tabelaryczny zgodny ze swoją definicją. Procedura składowana jest natomiast przeznaczona do wykonywania sekwencji operacji, w tym modyfikowania danych oraz kontrolowania transakcji. Jeżeli wymagane jest zapisanie rekordu, aktualizacja wielu tabel, obsługa kolejności operacji i wycofanie zmian po błędzie, właściwym mechanizmem jest procedura składowana wywołana w kontrolowanym bloku transakcyjnym. Przykładowy przepływ może wyglądać następująco: procedura rozpoczyna transakcję, sprawdza warunki biznesowe, wykonuje zapis do tabel i zatwierdza całość albo wycofuje wszystkie zmiany. Funkcja może w takim przepływie obliczyć wartość potrzebną do sprawdzenia warunku, ale nie powinna być traktowana jako etap zapisujący dane. Umieszczenie logiki modyfikującej w funkcji nie jest rozwiązaniem problemu, ponieważ parser SQL Server odrzuci niedozwoloną instrukcję albo projekt wymusi przebudowanie funkcji na procedurę. Podział ten ułatwia także rozpoznanie, gdzie znajduje się odpowiedzialność za spójność operacji. Skutki ograniczeń dla diagnostyki zapytańPodczas analizy problemu należy sprawdzić, czy funkcja tylko odczytuje dane i oblicza wynik, czy też oczekuje od niej działania właściwego dla procedury składowanej. Objawem nieprawidłowego projektu może być próba wykonania polecenia modyfikującego tabelę w funkcji, błąd kompilacji definicji albo brak oczekiwanego wpisu w tabeli po wywołaniu funkcji. Warto wtedy prześledzić miejsce wywołania, definicję funkcji oraz procedurę, która powinna odpowiadać za zapis. Szczególną uwagę należy zwrócić na modyfikacje zmiennych tabelarycznych, ponieważ są dozwolone, ale nie oznaczają zapisania danych do trwałej tabeli. Znaczenie ma również sposób wywołania funkcji tabelarycznej. Inline TVF jest pojedynczym zapytaniem zwracającym wynik, natomiast wieloinstrukcyjna TVF korzysta z wewnętrznej zmiennej tabelarycznej, do której budowany jest rezultat. W obu przypadkach wynik jest częścią instrukcji wywołującej i podlega jej kontekstowi transakcyjnemu. Diagnostyka powinna więc obejmować poziom izolacji, blokady, czas trwania zapytania oraz kod procedury wywołującej, a nie tylko samą definicję funkcji. Jeżeli potrzebne jest atomowe wykonanie kilku zapisów, należy szukać transakcji w procedurze lub w kodzie aplikacji, który wywołuje procedurę, zamiast oczekiwać autonomicznego zapisu od funkcji. |