sql >> Database >  >> RDS >> Sqlserver

CONTROLEER Beperkingen in SQL Server

In dit artikel zullen we het hebben over CHECK-beperkingen. We zullen zien hoe u CHECK-beperkingen kunt toevoegen aan SQL Server-tabelkolommen en de valkuilen bespreken die u kunt tegenkomen bij het gebruik van dit type SQL Server-beperkingen.

CONTROLEER de basisprincipes van beperkingen

CHECK-beperkingen zijn eenvoudig voorwaardelijke instructies (predikaten die TRUE of FALSE retourneren) die verwijzen naar tabelkolommen om de gegevensintegriteit te behouden. Wanneer men gegevens in een kolom of meerdere kolommen in een enkele rij invoegt, treden de CHECK-beperkingen in werking. Ze evalueren de in te voegen gegevens. Als de gegevens niet voldoen aan de voorwaarde die is gespecificeerd in de beperking CHECK, mislukt de invoeging.

Beschouw het volgende voorbeeld:

Het is vereist om een ​​beperking in te stellen voor de kolom Salaris, zodat deze alleen positieve waarden opslaat die niet hoger zijn dan $ 150.000. De voorwaardelijke verklaring ziet er als volgt uit:(Salaris>=0 en Salaris <=150000). Bij een poging om negatieve waarden in te voegen, resulteert het predikaat in FALSE en zal de invoeging mislukken.

Het is mogelijk om een ​​CHECK-beperking toe te voegen aan een enkele of meerdere kolommen. Het toevoegen van een CHECK-beperking met meerdere kolommen kan op tabelniveau worden geïmplementeerd.

Werken met CHECK-beperkingen

Check-beperkingen maken in SSMS

  1. In Object Explorer , navigeer naar een gewenste tabel.

  2. Klik met de rechtermuisknop op de Beperkingen map en dan c lik Nieuwe beperking…

  3. In het rechterdeelvenster van Controleer beperkingen dialoogvenster, klik op Expressie en klik vervolgens op de ellipsknop.

  1. Typ een CHECK-beperkingsexpressie in het tekstveld van de Check Constraint Expression dialoog venster. Als u bijvoorbeeld alleen postcodes van zeven cijfers in een postcodekolom wilt toestaan, kan de uitdrukking er als volgt uitzien:

In de Tabelontwerper sectie, kunt u de regels instellen om de beperking af te dwingen.

CONTROLEER Beperking bij MAAK TABEL

Beschouw het volgende voorbeeld:

Het is vereist om een ​​tabel te maken waarin gegevens over bankklanten worden opgeslagen en deze te vullen met testgegevens. De tabel bevat de volgende kolommen:Klant-ID, Voornaam, Achternaam, Status, Telefoon, Stad, Provincie en Postcode.

Tijdens het ontwikkelen van de tabel moeten we rekening houden met de volgende feiten:

  1. Het standaard ZIP-formaat bestaat uit vijf numerieke cijfers.

  2. Het standaard Amerikaanse telefoonnummer bestaat uit tien cijfers, zoals (555) 555-1234

  3. Afkortingen van twee letters worden gebruikt om de politieke afdelingen van de Verenigde Staten voor postadressen, gegevensverwerking, algemene afkortingen en andere doeleinden weer te geven.

De taak is om gegevensconsistentie voor de tabel te bieden. Het is verplicht om het invoegen van 12-cijferige telefoonnummers en 6-cijferige zips enz. te verbieden. Om dit te doen, stelt SQL Server ons in staat om een ​​of meer CHECK-beperkingen toe te voegen voor elke tabelkolom.

In de vorige sectie hebben we de enige manier onderzocht om een ​​CHECK-beperking in SSMS te creëren. Nu zullen we bespreken hoe we de beperking kunnen creëren met behulp van T-SQL.

Het volgende script laat zien hoe u een CHECK-beperking voor de Zip-kolom kunt maken:

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
)

Laten we eens kijken wat we krijgen als we proberen een 6-cijferige waarde in te voegen in de Zip-kolom:

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

Het invoegen mislukt en SQL Server geeft de volgende preventie weer:

Tot nu toe, zo goed.

CASE-expressie in CHECK-beperking

Stel dat de bank een bedrijfsregel heeft om de kredietlimiet voor inwoners van de staat Louisiana op minder dan $ 150.000 te zetten. We zullen deze vereiste implementeren door een CONTROLE-beperking toe te voegen aan de kolom Kredietlimiet:

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

Als we de bovenstaande instructie uitvoeren, krijgen we de volgende foutmelding:

De INSERT-instructie was in strijd met de CHECK-beperking. Wat ging er mis?

Laten we de zoekopdracht eens nader bekijken. Merk op dat de beperking CHECK alleen de 'LA'-waarden voor de kolom Status toestaat. Tegelijkertijd mogen de waarden in de kolom Krediet niet hoger zijn dan 150000.

Evenzo staat de beperking CHECK het niet toe om andere statuscodes in de kolom te schrijven.

We moeten dus de voorwaarde aanpassen. Volgens de bedrijfslogica verstrekt de bank $ 150.000 van de kredietlimiet voor inwoners van Louisiana. Tegelijkertijd kan deze waarde variëren voor andere bewoners.

Om dit geval te implementeren, gebruiken we de CASE-clausule binnen de CHECK-beperking:

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

Deze uitdrukking voldoet volledig aan de bedrijfslogica.

NULL-waarden in CHECK-beperking

De bank verdeelt haar klanten in segmenten. De kolom Status bevat de gegevens die bepalen of een klant VIP of regulier is. Het maximale bedrag van de kredietlimiet voor de vaste klanten is $ 200.000. De VIP's kunnen putten uit $ 500.000.

De beperking CHECK kan er als volgt uitzien:

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

Houd er rekening mee dat de CHECK-beperking het mogelijk maakt om NULL's in te voegen in de State-kolom (op voorwaarde dat er geen NOT NULL-beperking expliciet is gedefinieerd). De beperking CHECK evalueert de waarden en retourneert TRUE of FALSE. Het evalueert NULL als ONBEKEND. Daarom zullen NULL's geen fouten veroorzaken. Dit is in strijd met predikaten in WHERE-clausules in SELECT- of UPDATE-instructies.

CHECK en NOCHECK

Van tijd tot tijd verandert de bedrijfslogica. Het veroorzaakt wijzigingen in databaseobjecten. Stel je voor dat een land de postcodebasis uitbreidt en 6-cijferige waarden toevoegt.

De oude 5-cijferige waarden worden niet langer toegewezen aan de gebieden. Ze zijn echter nog steeds geldig voor bestaande. De beperking CHECK moet dus rekening houden met de bestaande gegevens in het oude formaat en gegevens valideren in het nieuwe formaat.

De NOCHECK-clausule lost dit probleem op:

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

De volgende invoeging is gelukt:

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

Wanneer u een vijfcijferige zip probeert in te voegen, geeft de engine de fout:

DBCC-CHECKCONSTRAINS

SQL Server biedt DBCC CHECKCONSTRAINTS om te zoeken naar gegevens die niet aan de beperkingen voldoen.

Als er een database-integriteitsprobleem is, voer dan DBCC CHECKCONSTRAINTS uit voor de hele database om er zeker van te zijn dat er geen problemen zijn.

Merk op dat deze opdracht de prestaties beïnvloedt. Daarom zou het niet op een geplande basis moeten draaien.

Het is mogelijk om DBCC CHECKCONSTRAINTS uit te voeren voor een enkele beperking, een tabel of de hele database.

Vergeleken met andere controlecommando's, kost DBCC CHECKCONSTRAINTS veel tijd om te voltooien en verbruikt het systeembronnen. In tegenstelling tot andere commando's maakt CHECKCONSTRAINTS geen gebruik van een database snapshot.

Conclusie

CHECK-beperkingen bieden het mechanisme voor het evalueren van gegevens voordat ze worden ingevoegd. CHECK-beperkingen kunnen verwijzen naar een enkele kolom of meerdere tabelkolommen.

Beperkingen zijn gewoon predikaten die resulteren in WAAR, ONWAAR of ONBEKEND. Als NULL in een tabel wordt ingevoegd, wordt er geen beperking geschonden.


  1. Java SQL FOUT:Relatietabelnaam bestaat niet

  2. SQL niet gelijk aan (!=) Operator voor beginners

  3. FOUT:kon stat-bestand niet XX.csv:onbekende fout

  4. Hoe te groeperen op twee kolommen in SQL