Czy wyłączanie i włączanie ograniczeń kluczy obcych jest obsługiwane w SQL Server? A może moja jedyna opcja, drop
a następnie ponownecreate
ograniczenie?
sql-server
tsql
foreign-keys
constraints
Promień
źródło
źródło
Odpowiedzi:
Jeśli chcesz wyłączyć wszystkie ograniczenia w bazie danych, po prostu uruchom ten kod:
Aby je ponownie włączyć, uruchom: (wydruk jest oczywiście opcjonalny i zawiera tylko tabele)
Uważam, że jest to przydatne podczas zapełniania danych z jednej bazy danych do drugiej. Jest to znacznie lepsze podejście niż usuwanie ograniczeń. Jak wspomniałeś, przydaje się przy upuszczaniu wszystkich danych w bazie danych i ponownym ich wypełnianiu (powiedzmy w środowisku testowym).
Jeśli usuwasz wszystkie dane, to rozwiązanie może okazać się pomocne.
Czasami przydaje się również wyłączenie wszystkich wyzwalaczy, możesz zobaczyć pełne rozwiązanie tutaj .
źródło
"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Czy powinien tam być tylko jeden „SPRAWDŹ”?http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx
źródło
Aby wyłączyć ograniczenie, masz
ALTER
tabelę za pomocą NOCHECKAby umożliwić korzystanie z podwójnego SPRAWDŹ :
Po zakończeniu, jeśli chcesz sprawdzić status, użyj tego skryptu, aby wyświetlić stan ograniczenia. Będzie bardzo pomocny:
źródło
sys.sysforeignkeys
msdn.microsoft.com/en-us/library/ms177604.aspxNajlepszą opcją jest DROP i TWORZENIE ograniczeń klucza obcego.
W tym poście nie znalazłem przykładów, które działałyby dla mnie „tak, jak są”, jeden nie działałby, gdyby klucze obce odwoływały się do różnych schematów, drugi nie działałby, gdyby klucze obce odnosiły się do wielu kolumn. Ten skrypt uwzględnia zarówno wiele schematów, jak i wiele kolumn na klucz obcy.
Oto skrypt, który generuje instrukcje „DODAJ OGRANICZENIE”, w przypadku wielu kolumn rozdzieli je przecinkami ( pamiętaj, aby zapisać dane wyjściowe przed wykonaniem instrukcji DROP ):
Oto skrypt, który generuje instrukcje „DROP CONSTRAINT”:
źródło
Standard SQL-92 pozwala deklarować constaint jako DEFERRABLE, dzięki czemu można go odroczyć (pośrednio lub jawnie) w ramach transakcji. Niestety, SQL Server nadal nie ma tej funkcji SQL-92.
Dla mnie zmiana ograniczenia na NOCHECK jest podobna do zmiany struktury bazy danych w locie - usunięcie ograniczeń z pewnością jest - i coś, czego należy unikać (np. Użytkownicy wymagają zwiększonych uprawnień).
źródło
Zgadzam się z tobą, Hamlin. Gdy przesyłasz dane za pomocą SSIS lub chcesz replikować dane, wydaje się, że konieczne jest tymczasowe wyłączenie lub usunięcie ograniczeń klucza obcego, a następnie ponowne ich włączenie lub odtworzenie. W takich przypadkach integralność referencyjna nie stanowi problemu, ponieważ jest już utrzymywana w źródłowej bazie danych. Dlatego możesz być spokojny w tej sprawie.
źródło
źródło
WITH CHECK CHECK
jest prawie na pewno wymagane!Ten punkt został poruszony w niektórych odpowiedziach i komentarzach, ale uważam, że wystarczająco ważne jest, aby ponownie go przywołać.
Ponowne włączenie ograniczenia za pomocą następującego polecenia (nie
WITH CHECK
) będzie miało poważne wady .Uwaga: Z NOCHECK domyślnie włączane są ograniczenia. Muszę się zastanawiać, dlaczego ...
Sys.foreign_keys widok System zapewnia pewien wgląd w tej kwestii. Pamiętaj, że ma zarówno kolumnę, jak
is_disabled
iis_not_trusted
kolumnę.is_disabled
wskazuje, czy przyszłe operacje manipulacji danymi zostaną sprawdzone pod kątem ograniczenia.is_not_trusted
wskazuje, czy wszystkie dane aktualnie zawarte w tabeli zostały sprawdzone pod kątem ograniczenia.Czy Twoim ograniczeniom można zaufać? Odkryć...
źródło
Pierwszy post :)
W przypadku OP rozwiązanie kristof będzie działać, chyba że wystąpią problemy z ogromnymi problemami z danymi i balonami dziennika transakcji przy dużych usunięciach. Ponadto, nawet z zapasem pamięci tlog, ponieważ usunięcie zapisu do tlogu, operacja może zająć BARDZO długi czas dla tabel z setkami milionów wierszy.
Używam serii kursorów, aby często obcinać i ponownie ładować duże kopie jednej z naszych ogromnych produkcyjnych baz danych. Opracowane rozwiązanie uwzględnia wiele schematów, wiele kolumn kluczy obcych, a co najważniejsze, można je wyodrębnić do użycia w SSIS.
Polega ona na utworzeniu trzech tabel pomostowych (prawdziwych tabel) do przechowywania skryptów DROP, CREATE i CHECK FK, tworzeniu i wstawianiu tych skryptów do tabel, a następnie zapętlaniu tabel i wykonywaniu ich. Załączony skrypt składa się z czterech części: 1.) tworzenie i przechowywanie skryptów w trzech tabelach pomostowych (rzeczywistych), 2.) wykonywanie skryptów upuszczania FK za pomocą kursora jeden po drugim, 3.) Używanie sp_MSforeachtable do obcinania wszystkich tabele w bazie danych inne niż nasze trzy tabele pomostowe oraz 4.) wykonywanie skryptów FK i sprawdzanie skryptów FK na końcu pakietu ETL SSIS.
Uruchom część dotyczącą tworzenia skryptu w zadaniu Wykonaj SQL w SSIS. Uruchom część „Wykonaj Skrypty FK” w drugim zadaniu Wykonaj SQL. Umieść skrypt obcinania w trzecim zadaniu Wykonaj SQL, a następnie wykonaj wszystkie inne procesy ETL, które musisz wykonać przed dołączeniem skryptów UTWÓRZ i SPRAWDŹ w końcowym zadaniu Wykonaj SQL (lub dwa w razie potrzeby) na końcu przepływu sterowania.
Przechowywanie skryptów w prawdziwych tabelach okazało się nieocenione, gdy ponowne zastosowanie kluczy obcych kończy się niepowodzeniem, ponieważ możesz wybrać * z sync_CreateFK, skopiować / wkleić do okna zapytania, uruchamiać je pojedynczo i naprawić problemy z danymi po znajdź te, które się nie powiodły / nadal nie mogą ponownie złożyć wniosku.
Nie uruchamiaj ponownie skryptu ponownie, jeśli się nie powiedzie, nie upewniając się, że ponownie zastosujesz wszystkie klucze / kontrole obce przed tym, lub najprawdopodobniej stracisz trochę tworzenia i sprawdzisz skrypty fk, gdy nasze tabele pomostowe zostaną upuszczone i odtworzone przed utworzeniem skryptów do wykonania.
źródło
Znajdź ograniczenie
Uruchom SQL wygenerowany przez ten SQL
Bezpieczna droga.
Uwaga: Dodano rozwiązanie dla usuwania ograniczenia, aby tabela mogła zostać usunięta lub zmodyfikowana bez błędu wiązania.
źródło
Kliknij prawym przyciskiem myszy projekt tabeli i przejdź do Relacje i wybierz klucz obcy w panelu po lewej stronie oraz w panelu po prawej stronie, ustaw opcję Wymuś ograniczenie klucza obcego na „Tak” (aby włączyć ograniczenia klucza obcego) lub „Nie” (aby wyłącz to).
źródło
Odpowiedź oznaczona jako „905” wygląda dobrze, ale nie działa.
Obserwowanie działało dla mnie. Żaden klucz główny, klucz unikalny lub ograniczenia domyślne NIE mogą zostać wyłączone. W rzeczywistości, jeśli „sp_helpconstraint” pokazuje „n / a” w status_enabled - oznacza, że NIE można go włączyć / wyłączyć.
- Aby wygenerować skrypt do WYŁĄCZENIA
- Aby wygenerować skrypt do ENABLE
źródło
Powinieneś być w stanie wyłączyć ograniczenia klucza obcego w taki sam sposób, w jaki tymczasowo wyłączasz inne ograniczenia:
Upewnij się tylko, że wyłączasz ograniczenie w pierwszej tabeli wymienionej w nazwie ograniczenia. Na przykład, jeśli moim ograniczeniem dla klucza obcego było FK_LocationsEmployeesLocationIdEmployeeId, chciałbym użyć następujących opcji:
nawet jeśli naruszenie tego ograniczenia spowoduje błąd, który niekoniecznie określa tę tabelę jako źródło konfliktu.
źródło
Jeden skrypt, który rządzi nimi wszystkimi: łączy to polecenia obcinania i usuwania ze sp_MSforeachtable, dzięki czemu można uniknąć upuszczania i odtwarzania ograniczeń - wystarczy określić tabele, które należy usunąć, a nie obcięte, a dla moich celów na dobre zawarłem dodatkowy filtr schematu miara (testowana w 2008r2)
źródło
Możesz tymczasowo wyłączyć ograniczenia w swoich tabelach, wykonać pracę, a następnie je odbudować.
Oto prosty sposób, aby to zrobić ...
Wyłącz wszystkie indeksy, w tym klucze podstawowe, co spowoduje wyłączenie wszystkich kluczy obcych, a następnie ponownie włącz tylko klucze podstawowe, abyś mógł z nimi pracować ...
[Zrób coś, na przykład ładując dane]
Następnie ponownie włącz i odbuduj indeksy ...
źródło
@sql
zawsze zostaje obcięte. :(Mam bardziej przydatną wersję, jeśli jesteś zainteresowany. Wyciągnąłem trochę kodu z witryny, na której link nie jest już aktywny. Zmodyfikowałem go, aby uwzględnić tablicę tabel w procedurze przechowywanej, i wypełnia upuszczanie, obcinanie, dodawanie instrukcji przed wykonaniem wszystkich. Dzięki temu masz kontrolę nad tym, które tabele wymagają obcinania.
źródło