17.03.2015 Views

2. Füüsiline disain

2. Füüsiline disain

2. Füüsiline disain

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

kasutada vaid selliste kitsenduste jõustamiseks, mille kontrollimiseks on vaja<br />

teada ainult andmeid lisatavas/muudetavas reas (näiteks<br />

kinnitamise_aeg>=#01/01/2000# või kinnitamise_aeg>=loomise_aeg). Kui<br />

tabeli T rea r kitsendusele vastamise kontrollimiseks on vaja lugeda teisi T<br />

ridu või teiste tabelite ridu, siis tuleb kitsendus jõustada trigerite abil (vt.<br />

teema 13).<br />

Kitsendusi saab kirjeldada ka domeeni objektides:<br />

CREATE DOMAIN d_eesti_isikukood AS CHAR(11) NOT NULL<br />

CONSTRAINT Isikukood_koosneb_11_numbrist CHECK(VALUE ~<br />

'^([[:digit:]]{11})$')<br />

CONSTRAINT Esimene_number_peab_olema_vahemikus_3_ja_6<br />

CHECK(VALUE ~ '^([3-6]{1}.*)$')<br />

CONSTRAINT Neljas_number_peab_olema_0_voi_1 CHECK(VALUE ~ '^(.<br />

{3}[0-1]{1}.*)$')<br />

CONSTRAINT Kuues_number_peab_olema_vahemikus_0_ja_3<br />

CHECK(VALUE ~ '^(.{5}[0-3]{1}.*)$');<br />

CREATE TABLE Isik<br />

(isikukood d_isikukood,<br />

...<br />

);<br />

Kitsendusi saab kirjeldada ka assertion objektides:<br />

CREATE ASSERTION assertion_1<br />

CHECK ((SELECT Avg(column_1) FROM Table_1)>(SELECT<br />

Avg(column_2) FROM Table_2));<br />

Assertion objekti kirjeldatav kitsendus peab hõlmama üks või rohkem tabelit.<br />

CREATE ASSERTION assertion_1<br />

CHECK ((SELECT Avg(column_3) FROM Table_3)>40);<br />

Paljudes andmebaasisüsteemides selliseid objekte luua ei saa.<br />

Näide: Kuidas vältida tühja stringi kasutamist PostgreSQL (9.0) veeru<br />

väärtustamisel?<br />

CREATE TABLE Amet (ameti_kood SMALLINT NOT NULL,<br />

nimetus VARCHAR(50) NOT NULL,<br />

CONSTRAINT pk_amet PRIMARY KEY (ameti_kood),<br />

CONSTRAINT chk_nimetus CHECK (nimetus!=''));<br />

INSERT INTO Amet (ameti_kood, nimetus) VALUES (99,'');<br />

ERROR: new row for relation "amet" violates check constraint "chk_nimetus"<br />

Näide: Andmebaasisüsteemis MS Access (2000) ei saa kasutada CHECK<br />

kitsendusi. Graafilise kasutajaliidese (Tabel Designer) abil saab tabeli ja<br />

13

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!