Добавление ограничения в PL / SQL - PullRequest
1 голос
/ 29 ноября 2011

У меня есть две таблицы:

Employee(eid, ename, age..)
Department(deptid, dname, managerid..) //manager id references eid

Как я могу создать ограничение для таблицы Department, чтобы возраст менеджера всегда был> 25?

Ответы [ 2 ]

7 голосов
/ 29 ноября 2011

В Oracle 11g вы можете использовать виртуальный столбец для назначения внешнего ключа:

CREATE TABLE emp (eid NUMBER PRIMARY KEY,
                  age NUMBER NOT NULL,
                  eligible_mgr_eid AS (CASE WHEN age > 25 THEN eid ELSE NULL END) UNIQUE
                 );

CREATE TABLE dept (did NUMBER PRIMARY KEY,
                   mgr_id NUMBER NOT NULL REFERENCES emp (eligible_mgr_eid) );
7 голосов
/ 29 ноября 2011

Ограничение не может содержать подзапрос, поэтому необходим триггер, если вы хотите применить это бизнес-правило на уровне базы данных.Примерно так.

create or replace trigger dep_briu_trg
  before insert or update on department  
  for each row
declare
  l_age employee.age%type;   

    begin
       select age
       into l_age
       from empoyee
       where id=:new.managerid;

       if l_age<=25 then
        raise application_error(-20000,'Manager is to young');
       end if;
    exception
       when no_data_found then
        raise application_error(-20000,'Manager not found');
    end;

Кстати, никогда не храните возраст в таблице.Это отличается каждый день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...