Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SPRAWDŹ Ograniczenia w SQL Server

W tym artykule omówimy ograniczenia CHECK. Zobaczymy, jak dodać ograniczenia CHECK do kolumn tabeli SQL Server i omówimy pułapki, które możesz napotkać podczas korzystania z tego typu ograniczeń SQL Server.

SPRAWDŹ podstawy ograniczeń

Ograniczenia CHECK to po prostu instrukcje warunkowe (predykaty zwracające wartość TRUE lub FALSE), które odwołują się do kolumn tabeli w celu zachowania integralności danych. Gdy wstawia się dane do kolumny lub kilku kolumn w jednym wierszu, wchodzą w życie ograniczenia CHECK. Oceniają dane, które mają zostać wstawione. W przypadku, gdy dane nie spełniają warunku określonego w ograniczeniu CHECK, wstawienie nie powiedzie się.

Rozważ następujący przykład:

Wymagane jest ustawienie ograniczenia w kolumnie Wynagrodzenie, tak aby zawierała tylko wartości dodatnie nieprzekraczające 150 000 USD. Instrukcja warunkowa będzie wyglądać następująco:(Wynagrodzenie>=0 i Wynagrodzenie <=150000). Podczas próby wstawienia wartości ujemnych predykat da w wyniku FALSE, a wstawienie się nie powiedzie.

Możliwe jest dodanie ograniczenia CHECK do jednej lub wielu kolumn. Dodanie wielokolumnowego ograniczenia CHECK można zaimplementować na poziomie tabeli.

Praca z ograniczeniami CHECK

Jak tworzyć ograniczenia wyboru w programie SSMS

  1. W Eksploratorze obiektów , przejdź do wymaganej tabeli.

  2. Kliknij prawym przyciskiem myszy Ograniczenia folder, a następnie c kliknij Nowe ograniczenie…

  3. W prawym okienku Sprawdź ograniczenia w oknie dialogowym kliknij Wyrażenie a następnie kliknij przycisk z wielokropkiem.

  1. Wpisz wyrażenie ograniczające CHECK w polu tekstowym Wyrażenie sprawdzające ograniczenie Okno dialogowe. Na przykład, aby dopuścić tylko siedmiocyfrowe kody pocztowe w kolumnie Zip, wyrażenie może wyglądać następująco:

W Projekcie tabel sekcji, możesz ustawić reguły wymuszające ograniczenie.

SPRAWDŹ Ograniczenie w UTWÓRZ TABELĘ

Rozważ następujący przykład:

Wymagane jest stworzenie tabeli przechowującej dane o klientach banku i wypełnienie jej danymi testowymi. Tabela będzie zawierać następujące kolumny:Identyfikator klienta, Imię, Nazwisko, Status, Telefon, Miasto, Stan i Kod pocztowy.

Przy opracowywaniu tabeli musimy wziąć pod uwagę następujące fakty:

  1. Podstawowy format ZIP składa się z pięciu cyfr.

  2. Standardowy amerykański numer telefonu składa się z dziesięciu cyfr, na przykład (555) 555-1234

  3. Dwuliterowe skróty są używane do reprezentowania podziałów politycznych Stanów Zjednoczonych w zakresie adresów pocztowych, przetwarzania danych, ogólnych skrótów i innych celów.

Zadaniem jest zapewnienie spójności danych w tabeli. Wymagane jest zabronienie wstawiania 12-cyfrowych numerów telefonów, 6-cyfrowych kodów pocztowych itp. Aby to zrobić, SQL Server pozwala nam dodać jedno lub więcej ograniczeń CHECK dla każdej kolumny tabeli.

W poprzedniej sekcji zbadaliśmy jeden ze sposobów tworzenia ograniczenia CHECK w SSMS. Teraz omówimy, jak utworzyć ograniczenie za pomocą T-SQL.

Poniższy skrypt pokazuje, jak utworzyć ograniczenie CHECK w kolumnie Zip:

CREATE TABLE Customers
(
 Customer_Id tinyint NOT NULL,
 [First Name] varchar(50),
 [Last Name] varchar(50),
 Status varchar(50),
 Phone tinyint,
 Address varchar(50),
 State varchar(50),
 Zip tinyint,
 Email varchar(50),
 [Credit Limit] INT NULL,
 CONSTRAINT CK_Zip CHECK (Zip LIKE REPLICATE ('[0-9]', 5)) --Check Constraint Condition
)

Teraz zobaczmy, co otrzymamy, próbując wstawić 6-cyfrową wartość do kolumny Zip:

INSERT INTO dbo.Customers (Customer_Id, [First Name], [Last Name], Status, Phone, Address, State, Zip, Email)
SELECT 1, 'James', 'Madison', 'Mr', 555-555-1234, 'Madison street, 12', 'LA', 123456, NULL
GO

Wstawienie nie powiodło się, a SQL Server wyświetla następujące zabezpieczenia:

Jak dotąd tak dobrze.

Wyrażenie CASE w ograniczeniu CHECK

Załóżmy, że bank ma regułę biznesową, która ustala limit kredytowy dla mieszkańców stanu Luizjana poniżej 150 000 USD. Wdrożymy to wymaganie, dodając ograniczenie CHECK do kolumny Limit kredytowy:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Credit_Limit
CHECK (State='LA' AND [Credit Limit] <= 150000)
GO

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (1, 'James Black', 'Mr', 5558787, 'LA', 46853, '[email protected]', 120000);
GO

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (2, 'Mark Spencer', 'Mr', 3332244, 'NY', 23487, '[email protected]', 200000);
GO

Gdy wykonujemy powyższą instrukcję, otrzymujemy następujący błąd:

Instrukcja INSERT kolidowała z ograniczeniem CHECK. Co poszło nie tak?

Przyjrzyjmy się bliżej zapytaniu. Zauważ, że ograniczenie CHECK dopuszcza tylko wartości „LA” w kolumnie Stan. Jednocześnie wartości w kolumnie Kredyt nie mogą przekraczać 150000.

Podobnie ograniczenie CHECK nie pozwoliłoby na zapisywanie innych kodów stanów w kolumnie.

W związku z tym musimy zmodyfikować warunek. Zgodnie z logiką biznesową, bank zapewnia mieszkańcom Luizjany 150000 USD limitu kredytowego. Jednocześnie ta wartość może się różnić dla innych mieszkańców.

Aby zaimplementować ten przypadek, użyjemy klauzuli CASE wewnątrz ograniczenia CHECK:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Credit_Limit
CHECK (CASE WHEN State='LA' AND [Credit Limit] <= 150000 THEN 1 ELSE 0 END = 1)
GO

To wyrażenie całkowicie odpowiada logice biznesowej.

Wartości NULL w ograniczeniu CHECK

Bank dzieli klientów na segmenty. Kolumna Status zawiera dane, które określają, czy klient jest VIP, czy zwykłym klientem. Maksymalna wysokość limitu kredytowego dla stałych klientów wynosi 200 000 USD. VIP-y mogą otrzymać 500 000 $.

Ograniczenie CHECK może wyglądać następująco:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Status_Credit_Limit
CHECK (Status = 'VIP' OR Status = 'Regular')
GO

Zauważ, że ograniczenie CHECK umożliwia wstawianie wartości NULL do kolumny Stan (pod warunkiem, że nie ma jawnie zdefiniowanego ograniczenia NOT NULL). Ograniczenie CHECK ocenia wartości i zwraca TRUE lub FALSE. Ocenia NULL jako UNKNOWN. Dlatego wartości NULL nie spowodują błędów. Jest to sprzeczne z predykatami w klauzulach WHERE w instrukcjach SELECT lub UPDATE.

SPRAWDŹ i NIE SPRAWDZ

Od czasu do czasu logika biznesowa się zmienia. Powoduje modyfikacje obiektów bazy danych. Wyobraź sobie, że kraj rozszerza bazę kodów pocztowych i dodaje 6-cyfrowe wartości.

Stare 5-cyfrowe wartości nie będą już przypisywane do obszarów. Jednak nadal obowiązują dla istniejących. Dlatego ograniczenie CHECK musi uwzględniać istniejące dane w starym formacie i walidować dane w nowym formacie.

Klauzula NOCHECK rozwiązuje ten problem:

ALTER TABLE Customers WITH NOCHECK
ADD CONSTRAINT CK_Zip_Code
CHECK (Zip LIKE REPLICATE('[0-9]', 6));
GO

Następujące wstawienie powiodło się:

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (102, 'Jake Harrison', 'VIP', 555-555-1234, 'NY', 123456, '[email protected]', 100000);
GO

Podczas próby włożenia pięciocyfrowego suwaka silnik wyrzuca błąd:

DBCC CHECKCONSTRAINTS

SQL Server udostępnia DBCC CHECKCONSTRAINTS do wyszukiwania danych, które nie pasują do ograniczeń.

Jeśli występuje problem z integralnością bazy danych, uruchom DBCC CHECKCONSTRAINTS dla całej bazy danych, aby upewnić się, że nie ma problemów.

Zauważ, że to polecenie wpływa na wydajność. Dlatego nie powinien działać zgodnie z harmonogramem.

Możliwe jest uruchomienie DBCC CHECKCONSTRAINTS dla pojedynczego ograniczenia, tabeli lub całej bazy danych.

W porównaniu do innych poleceń sprawdzania, wykonanie polecenia DBCC CHECKCONSTRAINTS zajmuje dużo czasu i zużywa zasoby systemowe. W przeciwieństwie do innych poleceń CHECKCONSTRAINTS nie wykorzystuje migawki bazy danych.

Wniosek

Ograniczenia CHECK zapewniają mechanizm oceny danych przed wstawieniem. Ograniczenia CHECK mogą odnosić się do pojedynczej kolumny lub wielu kolumn tabeli.

Ograniczenia to po prostu predykaty, których wynikiem jest PRAWDA, FAŁSZ lub NIEZNANE. W przypadku wstawienia do tabeli wartości NULL, ograniczenie nie zostanie naruszone.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klauzula WHERE vs ON podczas korzystania z funkcji JOIN

  2. Optymistyczna współbieżność:IsConcurrencyToken i RowVersion

  3. Zmień nazwę typu danych zdefiniowanego przez użytkownika w programie SQL Server (T-SQL)

  4. konwersja znacznika czasu Epoch na serwer sql (format czytelny dla człowieka)

  5. SQL Server:DELETE vs TRUNCATE