Sunteți pe pagina 1din 4

BD Proiect

Constrângere pentru verificarea unei date calendaristice în funcție de data curentă


În Oracle, indiferent de versiune, nu poate fi adăugată o constrângere de tip CHECK, care să verifice ceea
ce este introdus/modificat într-un câmp de tip dată calendaristică în funcție de data curentă, care se obține folosind
SYSDATE.

Scenariu de test:
CREATE TABLE x (
a DATE
);

Următorul exemplu este invalid:


ALTER TABLE x ADD CONSTRAINT x_a_CK CHECK (a > SYSDATE);
Error report -
ORA-02436: date or system variable wrongly specified in CHECK constraint
Mai multe explicații găsiți aici: http://www.dba-oracle.com/t_oracle_check_constraint.htm

Soluție: se folosește un trigger


Obs: pentru denumirea trigger-ului a fost folosită convenția de numire standard a trigger-ilor în Oracle:
http://www.dba-oracle.com/t_trigger_naming_standards.htm

CREATE OR REPLACE TRIGGER trg_x_BRIU


BEFORE INSERT OR UPDATE ON x
FOR EACH ROW
BEGIN
IF( :new.a <= SYSDATE )
THEN
RAISE_APPLICATION_ERROR( -20001,
'Data invalida: ' || TO_CHAR( :new.a, 'DD.MM.YYYY HH24:MI:SS' ) || ' trebuie sa fie mai mare decat data curenta.' );
END IF;
END;
/

Următorul exemplu este valid: (pentru data curentă 02.11.2018)


INSERT INTO x VALUES (TO_DATE('03.11.2018', 'DD.MM.YYYY'));

Următorul exemplu este invalid: (pentru data curentă 02.11.2018)


INSERT INTO x VALUES (TO_DATE('01.11.2018', 'DD.MM.YYYY'));
Error report -
ORA-20001: Data invalida: 01.11.2018 00:00:00 trebuie sa fie mai mare decat data curenta.

1/4
BD Proiect
Cum se implementează în Data Modeler: (se implementează la nivelul modelului fizic/relațional)
Modelul logic:

Modelul fizic: Click dreapta pe Physical Models []

2/4
BD Proiect
La Physical Models [], se deschide tree-ul Oracle Database 11g/12c/12cR2, apoi se deschide tree-ul Tables și se
dă click dreapta pe Triggers, apoi New și se completează conform codului de la prima pagină:

3/4
BD Proiect
Iar în tab-ul Trigger Body se completează codul trigger-ului:

La generarea codului, rezultă exact același cod scris la pagina 1:

x este numele tabelei

a este numele coloanei de tip DATE din tabela x


:new.a reprezintă noua valoare ce urmează a fi inserată
în coloana a din tabela x, care va fi analizată de trigger
atunci când se va declanșa în urma comenzii INSERT

Pentru sugestii de îmbunătățire a acestui tutorial, vă rog să trimiteți e-mail la cmironea@tuiasi.ro

4/4

S-ar putea să vă placă și