Windows - Mezőkre vonatkozó korlátok az SQL szerverben

forráskód letöltése
Az SQL szerver megoldást nyújt arra az esetre, ha egy tábla valamely mezőjébe csak meghatározott diszkrét értékeket, vagy bármilyen általunk definiált szabály szerinti értékeket akarunk felvenni. Cikkünkben körbejárjuk a témát, és példát is mutatunk a mezőtartalom korlátozásának használatára.
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.