Бизнес-правило в ORACLE SQL - PullRequest
0 голосов
/ 01 апреля 2020

Мне необходимо соблюдать это бизнес-правило: установите EXPIRATION_DATE NULL, если АРЕНДАТОР является ВЛАДЕЛЕЦОМ КВАРТИРЫ. EXPIRATION_DATE указывает дату истечения срока действия договора аренды

  • АРЕНДАТОР (COD_T, EXPIRATION_DATE, COD_APARTMENT) - там, где проживает арендатор
  • ВЛАДЕЛЕЦ (COD_O, COD_APARTMENT) - принадлежащие квартиры владельцу
  • APARTMENT (COD_APARTMENT)

Я хотел бы знать: если я использую этот скрипт и CHECK станет истинным, он автоматически установит EXPIRATION_DATE в NULL? Если нет, то как я могу это сделать?

CREATE TABLE TENANT( COD_T CHAR(5) PRIMARY KEY, COD_APARTMENT INT REFERENCES APARTMENT(COD_APARTMENT), EXPIRATION_DATE DATE (CHECK (COD_T IN ( SELECT COD_O -- same type COD_T FROM OWNER O WHERE COD_APARTMENT = O.CODAPARTMENT ) )<br> AND EXPIRATION_DATE IS NULL );

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Вы можете использовать представление для получения данных в требуемом формате проверочных ограничений

   CREATE OR replace VIEW tenant_vw
    AS
      SELECT cod_t,
             cod_apartment,
             CASE
               WHEN cod_t IN (SELECT cod_o -- same type COD_T
                              FROM   owner O
                              WHERE  cod_apartment = O.codapartment) THEN NULL
               ELSE expiration_date
             END AS EXPIRATION_DATE
      FROM   tenant;
0 голосов
/ 01 апреля 2020

Вы можете использовать view для таких требований, но если вы хотите, чтобы ваши данные обновлялись таким образом, вам нужно создать trigger следующим образом:

CREATE TRIGGER TRG_TENANT 
    BEFORE INSERT OR UPDATE ON TENANT
    FOR EACH ROW
DECLARE
    CNT   NUMBER;
BEGIN
    SELECT COUNT(1)
      INTO CNT
      FROM OWNER O
     WHERE O.CODAPARTMENT = :NEW.COD_APARTMENT
       AND O.COD_O = :NEW.COD_T;

    IF CNT > 0 THEN
        :NEW.EXPIRATION_DATE := NULL;
    END IF;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...