A mezők tartalmának korlátozására kétféle lehetőséget ajánl az SQL szerver. Az egyik a RULE-ok alkalmazása, a másik a CHECK kényszerek használata. A mezők tartalmát egyfelől a FOREIGN KEY segítségével lehet korlátozni, ami azt jelenti, hogy egy másik tábla tartalma befolyásolja az adott tábla mezőjének értékét. Ezzel szemben a RULE vagy CHECK kényszer hatására a megadott kifejezés kiértékelése dönti el, hogy egy érték szerepelhet-e a mezőben.
Rule
A RULE a korábbi verziókkal kapcsolatos kompatibilitási szempontból maradt bent az SQL szerverben.
CREATE RULE szabály AS feltételes_kifejezés
Ezzel a paranccsal hozhatunk létre szabályt. Meg kell adnunk a szabály nevét, majd a feltételes kifejezést, amely a WHERE feltételben megadható szintaxissal egyezik meg. Tartalmazhat aritmetikai és relációs operátorokat, valamint predikátumokat, mint az IN, BETWEEN, LIKE. Nem vonatkozhat oszlopnévre, vagy más adatbázis-objektumra. Tartalmaznia kell egy helyi változót, amely @ jellel kezdődik. Ezzel hivatkozik az INSERT vagy UPDATE utasítással megadott értékre. A változó neve bármi lehet. Pl.:
CREATE RULE fizetes
AS @fiz >= 50000 AND @fiz<= 200000
Ha elkészítettünk egy szabályt, akkor azt hozzáköthetjük egy felhasználói adattípushoz, vagy egy mezőhöz. Erre az sp_bindrule parancs szolgál.
sp_bindrule 'fizetes', 'tablanev.[oszlopnev]'
Az első paraméter a RULE neve, amit létrehoztunk, a második paraméter lehet egy mező, mint a példában is láttuk, vagy egy felhasználói típus. Ha már létezik ilyen típusú mező, akkor a RULE által alkotott szabályt megörökli valamennyi ilyen mező, de ha még egy paramétert használunk, amelynek értéke lehet: 'futureonly', akkor csak az elkövetkező meződefiníciókban lesz érvényes a szabály a felhasználói adattípus esetén.
Szabályt lecsatlakoztatni az sp_unbindrule tárolt eljárás segítségével, törölni pedig a DROP RULE-al lehet.
Check
A RULE használata helyett inkább ez utóbbi módszert javasoljuk a mezők tartalmának korlátozására. A CHECK definiálására többféle lehetőségünk van. Vagy akkor adjuk meg, amikor a táblát létrehozzuk a CREATE TABLE paranccsal, vagy később, az ALTER TABLE segítségével. Egyszerre több CHECK kényszer is alkalmazható egy táblán. Ha módosítani akarunk, akkor előbb töröljük a kényszert, majd hozzuk létre az újabb, módosított változatot. Ez a kényszer létrehozható úgy, hogy csak az új adatokra, de úgy is, hogy a régi adatokra is vonatkozzon. A CHECK kényszer kétféle módon kapcsolható ki. Ki tudjuk kapcsolni úgy, hogy az INSERT és UPDATE utasítások során ne érvényesüljön a hatása, de úgy is, hogy a replikáció során a kényszer ne kerüljön át a távoli adatbázisba.
Táblához így adhatunk CHECK kényszert:
ALTER TABLE dbo.tablanev ADD CONSTRAINT
Check_nev CHECK (mezo1 IN ('a','b’))
Ezzel a check_nev nevű kényszer kerül be a táblába. Az ellenőrzés során a mezo1 mező elemeinek vagy 'a' vagy 'b' karakternek kell lenniük. A kényszer kikapcsolását az alábbi módon tehetjük meg:
ALTER TABLE dbo.tablanev
NOCHECK CONSTRAINT Check_nev
Törölni kényszer az alábbi módon tudunk:
ALTER TABLE dbo.tablanev
DROP CONSTRAINT Check_nev
Ugyanezeket a műveleteket elvégezhetjük az Enterprise Manager segítségével is. Ha a tábla tervező nézetében a Manage Constraints... nyomógombra (az utolsó gomb az eszközsorban) kattintunk, akkor egy tulajdonságablak jelenik meg, amely segítségével többek között a CHECK kényszereket is elkészíthetjük, és a kikapcsolást is megvalósíthatjuk az "Enforce constraint for replication" és az "Enforce constraint for INSERTs and UPDATEs" kapcsolók segítségével.
A mellékelt példában szemléltetjük, hogy hogyan működnek a CHECK kényszerek.