Как проверить входные данные в запросе?

150
17 марта 2019, 20:00

У меня есть табличка по типу
| Id | Parent_Id | A | B | C

Как мне сделать так, чтобы можно было добавить запись либо с
[Parent_Id = null, а A, B обязаны содержать данные], либо
[Parent_id != null, но тогда A = null, B = null] ну а С всегда должен содержать данные? Всё что я нашёл это триггеры, но не знаю как их приделать под эту задачу :С

Answer 1

В Oracle я использовал триггеры для проверки нужных мне условий (в случае чего выбрасывал исключения или обрабатывал по своему). Например:

create or replace TRIGGER AVROPO_DML_ACCES_DENIED_04hour
    BEFORE
    INSERT OR
    UPDATE 
    ON xxx_table
    REFERENCING NEW AS NEW OLD AS OLD 
    FOR EACH ROW
    DECLARE
    CURSOR valid_user_cur IS 
                            select UPPER(login) login from 
                            (SELECT u.login, g.ID, g.NAME nm, g.SHORT_NAME, g.IS_ACTIVE, g.DESCRIPTION, g.id gid, r.CHILD AUTH_USER_ID
                            FROM auth_group g INNER JOIN cds3_object_relation r ON r.PARENT = g.ID
                            INNER JOIN auth_user u ON u.ID = r.CHILD
                            where 
                            g.ID in
                            ('5C30E6DA0224EF88E0531B411B0A4E73')
                            )a
                            left join
                            (select S_ID, OSUSER from (
                            select userenv('sessionid') s_id from dual )s
                            left join v$session v
                            on s.s_id = v.AUDSID
                            )b
                            on a.login=b.OSUSER;
    TYPE all_user_session IS TABLE OF valid_user_cur%ROWTYPE
    INDEX BY PLS_INTEGER;/*объявление типа и привязка ниже строкой к переменной для работы с коллекцией*/
    vuc all_user_session;
    avr_user VARCHAR2(30);
    flag BOOLEAN;
    no_acces EXCEPTION;
    BEGIN
    avr_user:= AVROPO.avr_get_usr(); 
    OPEN valid_user_cur;
    LOOP
    FETCH valid_user_cur BULK COLLECT INTO vuc;
        flag := false;
        IF (vuc.count > 0) THEN
           /*перебираем элементы коллекции*/
           FOR i IN vuc.first .. vuc.last
           LOOP
             IF (vuc(i).login = avr_user) 
                THEN flag := true; 
             END IF;
           EXIT WHEN flag=true;/*выход сразу если доступ есть (+цикл фор оптимизирован для bulk collect)*/
           END LOOP;
           /*конец перебора*/
        END IF;
    EXIT WHEN valid_user_cur%NOTFOUND;
    END LOOP;
            IF (TRUNC(SYSDATE) >= :old.date$) AND (flag=false) THEN RAISE no_acces; END IF;
            IF (TRUNC(SYSDATE) >= :new.date$) AND (flag=false) THEN RAISE no_acces; END IF;
            EXCEPTION
            WHEN no_acces THEN raise_application_error (-20069,'У вас недостаточно прав на внесение изменений за данный промежуток времени!');
            CLOSE valid_user_cur;
    END;
READ ALSO
Синхронизация двух+ баз данных

Синхронизация двух+ баз данных

Есть сайт для которого нужно сделать английскую версиюПроблема в том, что он уже почти реализован, и новую локализацию так просто не впихнуть

182
Помогите с правильным сбором данных для нейросети

Помогите с правильным сбором данных для нейросети

Нахожусь на этапе сбора данных для обучения свой нейронной сети, данные собираю в виде MySQL таблицыУ меня есть статьи на разные категории такие...

143
при обновление таблицы получаю ошибку 'student_id' doesn't have a default value'

при обновление таблицы получаю ошибку 'student_id' doesn't have a default value'

Пишу программу которая показывает какие дополнительные уроки посещает ученик, вот сущности

141
О чистоте кода CSS

О чистоте кода CSS

В большинстве руководств, рекомендуют всем родительским елементам задавать классы, но при этом рекомендуют использовать не более двух селекторов...

162