2016-02-02 1 views
0

Я создаю записи в транзакции.Есть ли способ объявить строку postgresql неизменяемой при заданном условии?

begin; 
update parent_records where id=5 set closed = now(); 
insert into child_records ...; 
commit; 

Я хочу, чтобы предотвратить вставки новых child_records когда родительский запись closed. Кажется, что установка правила на parent_records взорвалась на update действиях, когда закрытие решит проблему, поскольку транзакция завершится с ошибкой.

Я мог бы сделать обновление с where closed is null, а затем проверить код приложения, если какие-либо строки были обновлены и откат, но я предпочел бы ограничение в самой базе данных.

Как пометить родительскую строку неизменяемой (сбой обновлений с ошибкой) при выполнении условия (closed column not null)?

+0

Вы можете создать триггер, который выдает ошибку –

ответ

2

использовать триггер, например .:

create function before_update_on_parent_records() 
returns trigger language plpgsql as $$ 
begin 
    if old.closed is not null then 
     raise exception 'cannot update because the row is closed'; 
    end if; 
    return new; 
end $$; 

create trigger before_update_on_parent_records 
before update on parent_records 
for each row execute procedure before_update_on_parent_records(); 
+0

Спасибо. Я не знал о 'raise exception' – AJcodez

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