2013-08-01 15 views
5

Mam następujący kodCo oznacza ograniczenie drugiego czeku?

--first statement 
ALTER TABLE [nameOfMyTable] WITH CHECK ADD CONSTRAINT [nameOfMyConstraint] FOREIGN KEY([myFK]) 
REFERENCES [tableReference] ([myFK]) 
GO 
--second statement 
ALTER TABLE [nameOfMyTable] CHECK CONSTRAINT [nameOfMyConstraint] 
GO 

Najpierw zdefiniować ograniczenie sprawdzić w tabeli. Co oznacza drugie zdanie?

+2

Studio zarządzania serwerami sql generuje ten kod domyślnie – isxaker

+2

Zobacz: http://stackoverflow.com/questions/529941/whats-the-difference-between-with-check-add-constraint-followed-by-check -konstr – makciook

Odpowiedz

7

The 2nd stwierdzenie jest zbędny, jedyny raz byłoby potrzebne jest, jeśli pierwsza wypowiedź miała WITH NOCHECK. Domyślnie WITH CHECK jest dodawany, jeśli nie podano jawnie CHECK lub NOCHECK w instrukcji ADD CONSTRAINT.

sql server management studio generate this code by default – Mikhail

Ponieważ kod jest automatycznie generowane jest właśnie budowany przez zestaw kroków. Niektóre z tych kroków będą się częściowo pokrywać, więc krok "definicja stołu" "może włączać lub wyłączać sprawdzanie wiązania podczas tworzenia tabeli, ale krok" konfiguracja "może również włączać lub wyłączać wiązanie.

Relevant documentation:

z kontrolą | Z nocheck

  • Określa, czy dane w tabeli jest lub nie jest potwierdzone na nowo dodanej lub ponownie włączony klucz obcy lub sprawdź ograniczeń. Jeśli nie jest określony, przy założeniu nowych więzów przyjmuje się ZATRZYMANIE, a dla ograniczeń ponownie włączonych przyjmuje się, że Z NOCHECK.

  • Jeśli nie chcesz weryfikować nowych ograniczeń CHECK lub FOREIGN KEY względem istniejących danych, użyj WITH NOCHECK. Nie zalecamy wykonywania tego, z wyjątkiem rzadkich przypadków. Nowe ograniczenie zostanie ocenione w wszystkich późniejszych aktualizacjach danych. Wszelkie naruszenia ograniczeń, które są tłumione przez WITH NOCHECK po dodaniu ograniczenia, mogą spowodować niepowodzenie przyszłych aktualizacji , jeśli zaktualizują wiersze danymi, które nie są zgodne z ograniczeniem .

  • Optymalizator zapytań nie uwzględnia ograniczeń zdefiniowanych przy pomocy NOCHECK. Takie ograniczenia są ignorowane, dopóki nie zostaną ponownie włączone przy użyciu ALTER TABLE z CHECK CHECK CONSTRAINT ALL.

{SPRAWDŹ | NOCHECK} CONSTRAINT

  • Określa, że ​​nazwa_ograniczenia jest włączona lub wyłączona. Ta opcja może być używana tylko z ograniczeniami OBCEGO ZAGROŻENIA i CHECK. Po określeniu wartości NOCHECK ograniczenie jest wyłączone, a przyszłe wstawienia lub aktualizacje do kolumny nie są sprawdzane w warunkach ograniczenia. Ograniczenia DEFAULT, PRIMARY KEY i UNIQUE nie mogą być wyłączone.
1

Od docs:

Określa, że ​​constraint_name jest włączona lub wyłączona. Ta opcja może być używana tylko z ograniczeniami OBCEGO ZAGROŻENIA i CHECK. Po określeniu NOCHECK ograniczenie jest wyłączone, a przyszłe wstawienia lub aktualizacje kolumny nie są sprawdzane w warunkach ograniczenia. Nie można wyłączyć ograniczeń DEFAULT, PRIMARY KEY i UNIQUE.

1

Drugie sprawozdanie w danym kontekście jest zbędny, jeśli uruchomić natychmiast po utworzeniu z ograniczeniem (bez WITH CHECK, utworzenie klucz obcy z ADD CONSTRAINT FOREIGN KEY zrobi WITH CHECK natychmiast domyślnie).

Druga instrukcja służy do ponownie włączyć ograniczenie kontroli

ALTER TABLE [nameOfMyTable] CHECK CONSTRAINT [nameOfMyConstraint]; 

zwykle po to został wyłączony, tak jak poniżej:

ALTER TABLE [nameOfMyTable] NOCHECK CONSTRAINT [nameOfMyConstraint]; 
GO 

narzędzi skryptowych często tworzą DDL jak ten - przesadą, chociaż myślę, oni naprawdę chcą być pewni :)

Istnieje trzeci smak, który polega na ponownym sprawdzeniu poprawności ograniczenia, np. po wykonaniu kopii zbiorczej lub podobnej, która mogła unieważnić ograniczenie (oznaczono jako niezaufane). Odbywa się to tak:

ALTER TABLE [nameOfMyTable] WITH CHECK CHECK CONSTRAINT [nameOfMyConstraint]; 

Edycja Mam nadzieję, że to się this SQLFiddle czyści?