2016-09-20 1 views
0

У меня есть следующие таблицыБлок записи с обновлением

tbl_orders

CREATE TABLE tbl_orders (
    id integer NOT NULL, 
    customer_name character varying NOT NULL, 
    is_archived boolean NOT NULL 
); 

tbl_order_items

CREATE TABLE tbl_order_items (
    id integer NOT NULL, 
    product_name character varying NOT NULL, 
    quantity integer NOT NULL, 
    order_id int NOT NULL 
); 

В моем приложении у меня есть возможность заархивировать заказ, какой набор boolean isArchived to true для этой записи порядка. В записи заказа может быть несколько элементов заказа, которые я хочу предотвратить, чтобы не обновляться, когда порядок имеет значение boolean isArchived, установленное в true. Должен ли я установить логическое значение isArchived на уровне позиций заказа?

Можно ли предотвратить это на уровне базы данных?

+0

Один из вариантов заключается в создании триггера (до обновления) для tbl_order_items, который проверяет флаг tbl_orders is_archive для того, чтобы не выполнять обновление - https://www.postgresql.org/docs/current/static/sql-createtrigger.html. –

ответ

0

Вы можете создать BEFORE UPDATE триггер на tbl_order_itemsFOR EACH ROW, который выбрасывает ошибку, когда порядок NEW.order_id находится в архиве.

Это наиболее элегантное и нормализованное решение, но требует, чтобы триггер запускался всякий раз, когда обновляется строка в tbl_order_items.

Смежные вопросы