sql >> Database teknologi >  >> RDS >> Sqlserver

KONTROLLER begrænsninger i SQL Server

I denne artikel vil vi tale om CHECK-begrænsninger. Vi vil se, hvordan du tilføjer CHECK-begrænsninger til SQL Server-tabelkolonner og diskuterer de faldgruber, du kan støde på, når du bruger denne type SQL Server-begrænsninger.

TJEK grundlæggende begrænsninger

CHECK-begrænsninger er simpelthen betingede udsagn (prædikater, der returnerer SAND eller FALSK), der henviser til tabelkolonner for at opretholde dataintegritet. Når man indsætter data i en kolonne eller flere kolonner i en enkelt række, træder CHECK-begrænsninger i funktion. De evaluerer de data, der skal indsættes. Hvis dataene ikke opfylder den betingelse, der er angivet i CHECK-begrænsningen, mislykkes indsættelsen.

Overvej følgende eksempel:

Det er påkrævet at indstille en begrænsning til kolonnen Løn, så den kun gemmer positive værdier, der ikke overstiger 150.000 USD. Den betingede erklæring vil se således ud:(Løn>=0 og Løn <=150.000). Mens du forsøger at indsætte negative værdier, vil prædikatet resultere i FALSK, og indsættelsen mislykkes.

Det er muligt at tilføje en CHECK-begrænsning til en enkelt eller flere kolonner. Tilføjelse af en flerkolonne CHECK-begrænsning kan implementeres på tabelniveau.

Arbejde med CHECK-begrænsninger

Sådan opretter du CHECK-begrænsninger i SSMS

  1. I Object Explorer , naviger til en påkrævet tabel.

  2. Højreklik på Begrænsninger mappe og derefter c klik på Ny begrænsning...

  3. I højre rude i Kontroller begrænsninger dialogboksen skal du klikke på Udtryk og klik derefter på ellipseknappen.

  1. Skriv et CHECK-begrænsningsudtryk i tekstfeltet i Check Constraint-udtrykket dialog boks. For for eksempel kun at tillade syvcifrede postnumre i en postnummerkolonne, kan udtrykket se ud som følger:

I Tabeldesigner sektion, kan du opsætte reglerne for at håndhæve begrænsningen.

TJEK begrænsning på OPRET TABEL

Overvej følgende eksempel:

Det er påkrævet at oprette en tabel, der gemmer data om bankkunder og udfylde den med testdata. Tabellen vil indeholde følgende kolonner:Kunde-id, Fornavn, Efternavn, Status, Telefon, By, Stat og Postnummer.

Når vi udvikler tabellen, skal vi tage følgende fakta i betragtning:

  1. Det grundlæggende ZIP-format består af fem numeriske cifre.

  2. Det amerikanske standardtelefonnummer er ti cifre, såsom (555) 555-1234

  3. Tobogstavsforkortelser bruges til at repræsentere de politiske opdelinger i USA til postadresser, databehandling, generelle forkortelser og andre formål.

Opgaven er at sørge for datakonsistens for tabellen. Det er påkrævet at forbyde indsættelse af 12-cifrede telefonnumre og 6-cifrede zips osv. For at gøre dette tillader SQL Server os at tilføje en eller flere CHECK-begrænsninger for hver tabelkolonne.

I det foregående afsnit har vi undersøgt den ene måde at oprette en CHECK-begrænsning i SSMS. Nu vil vi diskutere, hvordan man opretter begrænsningen ved hjælp af T-SQL.

Følgende script viser, hvordan man opretter en CHECK-begrænsning på Zip-kolonnen:

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
)

Lad os nu se, hvad vi får, når vi forsøger at indsætte en 6-cifret værdi i Zip-kolonnen:

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

Indsættelse mislykkes, og SQL Server viser følgende forebyggelse:

Indtil videre, så godt.

CASE-udtryk i CHECK-begrænsning

Antag, at banken har en forretningsregel for at sætte kreditgrænsen for indbyggerne i staten Louisiana til at være under $150.000. Vi implementerer dette krav ved at tilføje en CHECK-begrænsning til kolonnen Kreditgrænse:

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

Når vi udfører ovenstående sætning, får vi følgende fejl:

INSERT-sætningen var i konflikt med CHECK-begrænsningen. Hvad gik galt?

Lad os se nærmere på forespørgslen. Bemærk, at CHECK-begrænsningen kun tillader 'LA'-værdierne for kolonnen State. Samtidig må værdierne i kolonnen Kredit ikke overstige 150.000.

Tilsvarende ville CHECK-begrænsningen ikke tillade skrivning af andre tilstandskoder i kolonnen.

Derfor er vi nødt til at ændre betingelsen. Ifølge forretningslogikken giver banken 150.000 USD af kreditgrænsen til indbyggere i Louisiana. Samtidig kan denne værdi variere for andre beboere.

For at implementere denne sag vil vi bruge CASE-sætningen inden for CHECK-begrænsningen:

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

Dette udtryk opfylder fuldstændig forretningslogikken.

NULL-værdier i CHECK-begrænsning

Banken opdeler sine kunder i segmenter. Kolonnen Status indeholder de data, der bestemmer, om en klient er VIP eller almindelig. Det maksimale beløb for kreditgrænsen for de almindelige kunder er $200.000. VIP'erne kan trække på $500.000.

CHECK-begrænsningen kan se ud som følger:

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

Bemærk, at CHECK-begrænsningen tillader indsættelse af NULL-værdier i kolonnen State (forudsat at der ikke er udtrykkeligt defineret en NOT NULL-begrænsning). CHECK-begrænsningen evaluerer værdierne og returnerer TRUE eller FALSE. Den vurderer NULL som UKENDT. Derfor vil NULL ikke forårsage fejl. Dette er i modstrid med prædikater i WHERE-sætninger i SELECT- eller UPDATE-sætninger.

CHECK og NOCHECK

Fra tid til anden ændrer forretningslogikken sig. Det forårsager ændringer af databaseobjekter. Forestil dig, at et land udvider postnummerbasen og tilføjer 6-cifrede værdier.

De gamle 5-cifrede værdier vil ikke længere blive tildelt områderne. De er dog stadig gyldige for eksisterende. Derfor skal CHECK-begrænsningen tage højde for de eksisterende data i det gamle format og validere data i det nye format.

NOCHECK-klausulen løser dette problem:

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

Følgende indsættelse er vellykket:

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

Når du forsøger at indsætte en femcifret zip, sender motoren fejlen:

DBCC CHECKCONSTRAINTS

SQL Server giver DBCC CHECKCONSTRAINTS til at søge efter data, der ikke matcher begrænsninger.

Hvis der er et problem med databaseintegriteten, skal du køre DBCC CHECKCONSTRAINTS for hele databasen for at sikre, at der ikke er nogen problemer.

Bemærk, at denne kommando påvirker ydeevnen. Derfor bør den ikke køre på en planlagt basis.

Det er muligt at køre DBCC CHECKCONSTRAINTS for en enkelt begrænsning, en tabel eller hele databasen.

Sammenlignet med andre kontrolkommandoer tager DBCC CHECKCONSTRAINTS betydelig tid at fuldføre og bruger systemressourcer. I modsætning til andre kommandoer, bruger CHECKCONSTRAINTS ikke et øjebliksbillede af databasen.

Konklusion

CHECK-begrænsninger giver mekanismen til at evaluere data før indsættelse. CHECK-begrænsninger kan henvise til en enkelt kolonne eller flere tabelkolonner.

Begrænsninger er simpelthen prædikater, der resulterer i SAND, FALSK eller UKENDT. Hvis NULL er indsat i en tabel, overtrædes en begrænsning ikke.


  1. T-SQL betinget bestilling af

  2. Sådan krypterer du en opdelt database i Access 2016

  3. Lær det grundlæggende i Java-logging

  4. UPPER() Funktion i Oracle