SQL: запретить обновление, если значение поля ниже определенного значения

#sql #constraints #h2 #flyway #database-trigger

#sql #триггеры #ограничения #h2 #способ выполнения

Вопрос:

Я хотел бы добавить ограничение в свою таблицу:

 create table asset (
   id number(19,0) not null,
    name varchar2(255 char),
    description varchar2(255 char),
    type varchar2(255 char),
    height number(10,0),
    width number(10,0),
    bytes blob,
    primary key (id)
);
  

после того, как на нем сохранены ресурсы с идентификатором от 0 до 8:

 ALTER TABLE ASSET ADD CONSTRAINT check_if_id_bigger_than_eight CHECK (ID > 8)
  

чтобы избежать дальнейших изменений строк с идентификаторами от 0 до 8, к сожалению, вышеописанное не работает, потому что не разрешено иметь данные, которые нарушают ограничения, есть простой способ сделать это?

Комментарии:

1. Вам нужно сделать это с помощью триггера. Ограничение распространяется на значения внутри строки. Это не флаг «да» / «нет», указывающий, можно ли обновлять значения.

2. H2 поддерживает только триггеры, написанные на Java. Вы не можете определить их в SQL

Ответ №1:

Этот триггер может сработать (синтаксис sql server)

 create trigger TR_8 
on asset
after insert, update

as
if exists(
 select * -- checks if new or modified datum has id between 0 and 8
 from inserted 
 where inserted.id between 0 and 8
)
begin
 RAISERROR ('Ids between 0 and 8 must stay untouched', 16, 10); --if so, rollback the transaction giving an error
 rollback transaction
end
  

Комментарии:

1. Спасибо, на самом деле это не работает на H2, вы знаете, как исправить синтаксис для H2?

2. Извините, я никогда не использовал H2. В любом случае я предлагаю вам добавить тег H2 к вашему вопросу