WYKORZYSTANIE OGRANICZEŃ
Wykorzystanie ograniczeń Konwencje nazewnicze
Wybór typu ograniczenia Blokowanie działania ograniczeń

Wykorzystanie ograniczeń:

Ograniczenia są preferowaną metodą wymuszania integralnoci danych. Poniższy paragraf omawia zasady definiowania ograniczeń, podstawy wyboru typu ograniczenia oraz typy integralnoci danych wymuszane przez poszczególne ograniczenia. Ostatni punkt w tym paragrafie opisuje sposoby blokowania działania ograniczeń.


Uwaga!
Ponieważ ograniczenia zgodne są z ANSI SQL, to obsługuje je wiele innych systemów zarządzania bazami danych oraz narzędzi programistycznych.


Ograniczenia definiuje się instrukcją CREATE TABLE lub ALTER TABLE. Ograniczenia te mogą opierać się na jednej lub wielu kolumnach, i mogą być dodawane do tabeli zawierającej dane. Jeli ograniczenie odnosi się do pojedynczej kolumny, to nazywa się je ograniczeniem na poziomie kolumny. Jeli ograniczenie odnosi się do wielu kolumn, to nazywa się je ograniczeniem na poziomie tabeli, nawet jeli nie odwołuje się do wszystkich kolumn w tabeli.

Częciowa składnia:
CREATE TABLE nazwa_tabeli

(nazwa_kolumny typ_danych
[[CONSTRAINT nazwa_ograniczenia]
{ PRIMARY KEY [CLUSTERED | NON CLUSTERED]
| UNIQUE [CLUSTERED | NON CLUSTERED]
| [FOREIGN KEY] REFERENCES tabela_ref [(kolumna_ref)]
| DEFAULT wyrażenie_stałe
| CHECK (wyrażenie_logiczne)
}
] [,...n]
[ograniczenie_tabeli]::=

| [CONSTRAINT nazwa_ograniczenia]
{ PRIMARY KEY | UNIQUE}
[CLUSTERED | NON CLUSTERED]
[(kolumna[,...n])]
| [FOREIGN KEY] [(kolumna[,...n])]
REFERENCES tabela_ref [(kolumna_ref[,...n])]
| CHECK (warunek_wyszukiwania)
}
} [,...n]
)

Przykład:

CREATE TABLE pracownicy
(
num_prac int CONSTRAINT id_prac UNIQUE,
num_rzel int CONSTRAINT ref_przel FOREIGN KEY
REFERENCES pracownicy (num_prac)
)

Przy tworzeniu i modyfikowaniu ograniczeń należy uwzględnić, że:


  • Przy dodawaniu ograniczenia do tabeli SQL Server weryfikuje istniejące dane.
  • Ograniczenia są obsługiwane niezależnie od struktury tabeli, w związku z czym można je tworzyć, zmieniać i usuwać bez usuwania i odtwarzania tabeli.
  • Każde przekroczenie ograniczenia przerywa wykonywaną instrukcję. Przykładowo, jeli spróbujesz utworzyć zamówienie dla nieistniejącego klienta, to 
  • zamówienie to zostanie anulowane.
  • Aby uzyskać informacje na temat ograniczeń należy uruchomić systemową procedurę w budowaną sp_helpconstraint lub sp_help.

Konwencje nazewnicze

Wybór typu ograniczenia

Każdy typ integralności: dziedziny, jednostki czy referencji, wymuszany jest przez inny typ ograniczenia. Ograniczenia zapewniają, że do kolumn wprowadzane są poprawne dane, a pomiędzy tabelami utrzymywane są relacje.

Poniżej opisane są różne typy ograniczeń. Dziedzina DEFAULT Określa wartość, która zostanie wprowadzona do kolumny, gdy wartość ta nie zostanie podana jawnie w instrukcji INSERT


  • CHECK Okrela wartoci, które są dozwolone w danej kolumnie. Jednostka PRIMARY KEY Jednoznacznie identyfikuje każdy wiersz-zapewnia, że użytkownicy nie wprowadzą powtarzających się wartoci, że nie będą wprowadzane wartoci null, oraz że utworzony jest indeks zwiększający wydajnoć.
  • UNIQUE Chroni przed powtórzeniami w dodatkowych (nie podstawowych) kluczach-zapewnia, że utworzony jest indeks zwiększający wydajnoć. Referencja FOREIGN KEY Definiuje kolumnę lub zestaw kolumn, których wartoci muszą odpowiadać kluczowi podstawowemu tej samej lub innej tabeli.



Blokowanie działania ograniczeń

Możliwe jest blokowanie jedynie ograniczeń CHECK i FOREIGN KEY. Inne ograniczenia muszą być usuwane, a następnie ponownie dodane.

Blokowanie działania ograniczeń na istniejące dane

W czasie definiowania ograniczenia dla tabeli posiadającej dane, SQL Server sprawdza automatycznie te dane, aby skontrolować, czy spełniają one warunki ograniczenia. Możliwe jest jednak zablokowanie działania ograniczenia na istniejące dane w czasie dodawania tego ograniczenia do tabeli. Aby zablokować działanie ograniczenia przy dodawaniu do tabeli zawierającej dane ograniczenia FOREIGN KEY lub CHECK, należy umiecić w instrukcji ALTER TABLE opcję WITH NOCHECK.

Częciowa składnia:
ALTER TABLE tabela
[WITH CHECK˝WITH NOCHECK]
ADD CONSTRAINT ograniczenie
[FOREIGN KEY] [(kolumna[,...n])]
REFERENCES tabela_ref [(kol_ref [,...n])]
[CHECK (warunek_wyszukiwania)]

Przykład:

ALTER TABLE sprzedaz
WITH NOCHECK
ADD CONSTRAINT poprawna_kwota
CHECK (kwota >=0)


Uwaga!

Modyfikacje danych wykonane po dodaniu ograniczenia muszą spełniać wszystkie ograniczenia, także w kolumnach nie umieszczonych na licie modyfikowanych kolumn. Przykładowo, jeli dodajesz ograniczenie CHECK do kolumny Kol A z opcją WITH NOCHECK, istniejące wartoci w Kol A nie są sprawdzane. Jeli póniej modyfikujesz kolumnę Kol B, a Kol A nie spełnia warunku CHECK, to aktualizacja nie uda się.

Przy blokowaniu działania ograniczeń na istniejące dane należy wziąć pod uwagę następujące zalecenia:


  • Opcji tej należy używać tylko wtedy, jeli istniejące dane nie będą modyfikowane-są to na przykład dane archiwalne.
  • Nie należy używać tej opcji, jeli istniejące dane mają być zmieniane. Przy aktualizacji dane muszą spełniać warunek CHECK.
  • Warto upewnić się, czy potrzebne jest blokowanie działania ograniczenia. Przed podjęciem decyzji o dodaniu ograniczenia można sprawdzić istniejące dane przy pomocy kwerendy.


Blokowanie działania ograniczeń przy wprowadzaniu danych Działanie ograniczenia może zostać zablokowane dla istniejących już ograniczeń CHECK i FOREIGN KEY, dzięki czemu wszystkie modyfikowane i dodawane dane nie będą sprawdzane przez te ograniczenia. Aby uniknąć przeciążenia sprawdzaniem ograniczeń, blokowanie ograniczeń może być potrzebne gdy:


  • Pewne jest, że dane spełniają warunki ograniczeń.
  • Wprowadzane dane nie spełniają warunków. Póniej, poprzez uruchomienie odpowiedniej kwerendy dane zostaną skorygowane, a ograniczenie ponownie uaktywnione.


Aktywacja ograniczenia, które zostało zablokowane wymaga wykonania kolejnej instrukcji ALTER TABLE, zawierającej klauzulę CHECK lub CHECK ALL.

Częciowa składnia:

ALTER TABLE tabela
{CHECK | NOCHECK} CONSTRAINT
{ALL | ograniczenie[,...n]}


Przykład:

ALTER TABLE sprzedaz
NOCHECK
CONSTRAINT poprawna_kwota


Aby sprawdzić, czy ograniczenie w tabeli jest aktywne, czy zablokowane, należy uruchomić systemową procedurę składowaną sp_help.


Uwaga!
Blokowanie ograniczeń w tabeli nie wpływa na ograniczenia w innych powiązanych z nią tabelach. Modyfikacje w tabeli nadal mogą generować błędy przekroczenia ograniczenia


na górę Strona główna