#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 к вашему вопросу