| Termin | Definicja |
|---|---|
| Tworzenie funkcji | Tworzenie funkcji poleceniem CREATE FUNCTION definiuje obiekt zwracający wartość lub zbiór wyników. Rola funkcji w modelu bazy danychFunkcja tworzona poleceniem Definicja funkcji zwykle obejmuje jej nazwę, parametry wejściowe, typ wyniku oraz ciało zawierające instrukcje SQL lub kod proceduralny obsługiwany przez dany silnik. Parametr ma określony typ danych, dlatego przekazana wartość może zostać zaakceptowana, przekształcona albo odrzucona w zależności od zgodności typów i reguł konwersji. Funkcja może korzystać z tabel, widoków, innych funkcji i konstrukcji warunkowych, lecz dokładny zakres dozwolonych operacji zależy od konkretnej implementacji. Najczęściej funkcję wywołuje się jako część wyrażenia, na przykład w klauzuli Parametry, wynik i miejsce wywołaniaProjektując funkcję, trzeba najpierw ustalić, czy wynik jest pojedynczą wartością, czy zbiorem rekordów. Funkcja skalarna powinna mieć jasno określony typ zwracany, ponieważ od niego zależy możliwość porównywania wyniku, sortowania oraz łączenia go z innymi wyrażeniami. Funkcja tabelaryczna wymaga zdefiniowania struktury zwracanych kolumn albo zapytania, którego wynik stanowi treść funkcji. W tym drugim przypadku istotne są nazwy kolumn, ich typy i kolejność. Ważnym elementem jest obsługa wartości Funkcja różni się od procedury składowanej sposobem użycia. Procedura jest zwykle uruchamiana jako osobna operacja i może służyć do wykonania sekwencji działań, natomiast funkcja została zaprojektowana przede wszystkim jako element wyrażenia lub źródło danych. Widok przechowuje zapytanie bez parametrów wejściowych albo z ograniczonym mechanizmem parametryzacji zależnym od produktu. Kod aplikacji wykonuje się poza bazą, więc wymaga przesłania danych między aplikacją a silnikiem. Funkcja może ograniczyć powielanie logiki, lecz przeniesienie zbyt dużej części programu do bazy utrudnia późniejsze testowanie i utrzymanie. Przy większych zbiorach danych znaczenie ma koszt wywołania. Funkcja użyta dla każdego wiersza może zwiększyć czas wykonania zapytania, szczególnie gdy jej ciało ponownie odczytuje tabele albo wykonuje kosztowne przekształcenia. Optymalizator nie w każdym silniku analizuje funkcję w takim samym stopniu jak bezpośrednio zapisane zapytanie. Dlatego warto sprawdzać plan wykonania i porównywać rozwiązanie funkcyjne z zapytaniem zapisanym bezpośrednio. Ślady błędów w definicji i działaniuJednym z częstych problemów jest utworzenie funkcji w innym schemacie lub bazie niż ta, z której korzysta aplikacja. Wywołanie bez pełnej nazwy może wtedy wskazywać nie ten obiekt, którego oczekuje program, albo zakończyć się błędem nierozpoznanej funkcji. Przy wdrożeniu należy kontrolować kolejność tworzenia zależności, uprawnienia do odczytu tabel oraz zgodność wersji definicji z kodem aplikacji. Błędy mogą wynikać także z niezgodności typów parametrów. Przekazanie tekstu tam, gdzie oczekiwana jest data lub liczba, czasem kończy się błędem, a czasem niejawną konwersją. Drugi przypadek jest szczególnie trudny do wykrycia, ponieważ wynik może być poprawny dla części danych i błędny dla pozostałych. Funkcja powinna jasno określać akceptowane typy, a aplikacja powinna walidować dane przed wywołaniem. Nieprawidłowy wynik często wiąże się z kolejnością działań, filtrowaniem rekordów albo obsługą pustego zbioru. Funkcja obliczająca wartość na podstawie wielu wierszy musi mieć ustalone zachowanie, gdy nie znajdzie żadnego rekordu lub gdy znajdzie kilka równorzędnych rekordów. Należy również rozstrzygnąć, czy wynik zależy od bieżącego czasu, ustawień sesji, języka, strefy czasowej lub kolejności sortowania. Diagnostyka powinna obejmować samą definicję, przykładowe parametry, plan wykonania oraz uprawnienia użytkownika wykonującego zapytanie. Warto testować przypadki graniczne: wartości zerowe, ujemne, bardzo długie teksty, brak powiązanego rekordu, powtarzające się identyfikatory i niepełne dane. Jeżeli funkcja modyfikuje dane lub korzysta z operacji o skutkach ubocznych, trzeba sprawdzić reguły transakcji i ograniczenia konkretnego silnika, ponieważ nie wszystkie implementacje pozwalają na taki sam zakres działań. Gdzie kończy się problem programistyczny, a zaczyna sprzętowySam błąd związany z funkcją jest zagadnieniem konfiguracji bazy, aplikacji albo uprawnień, więc jego rozwiązania szuka się w kodzie i środowisku programowym. Inaczej wygląda sytuacja, gdy komputer przerywa pracę podczas zapytań, zawiesza aplikacje, zgłasza błędy odczytu plików bazy lub traci dane po nagłym wyłączeniu. Wtedy przyczyną może być uszkodzony dysk, niestabilna pamięć, problem z zasilaniem albo przegrzewanie podzespołów. Warszawskie Pogotowie Komputerowe zajmuje się serwisem sprzętu komputerowego — laptopów i komputerów stacjonarnych. Jeżeli objawy wskazują na awarię nośnika, można również skonsultować podstawowy odzysk danych z uszkodzonego dysku lub innego nośnika. Przed przekazaniem urządzenia warto zanotować komunikaty, moment występowania awarii i to, czy problem pojawia się także przy innych programach. Nie należy wielokrotnie uruchamiać komputera z uszkodzonym dyskiem ani instalować na nim nowych danych, gdy ważne pliki mogą wymagać odzyskania. Takie informacje pomagają oddzielić błąd zapisanej funkcji od objawów awarii sprzętu i właściwie ustalić dalszą diagnostykę. |