Если вы хотите реализовать такое ограничение, вы обычно используете проверочное ограничение, а не триггер:
create table customer(
f_name varchar2(8 char) not null check(length(f_name) = 8))
s_name varchar2(30 char) not null,
passwd varchar2(20 char) not null,
constraint customer_f_name_pk primary key (f_name)
);
Примечания:
, что нет точка, объявляющая varchar(30)
, если вы все равно не разрешаете более 8 символов, поэтому я уменьшил это значение
, которое вы хотите varchar2
вместо varchar
(этот тип данных Oracle) рекомендуется в новом коде)
вы должны объявить длину столбца с помощью char
- по умолчанию это byte
, что может иметь неожиданное поведение, если ваши данные имеют многобайтовый символы
Но так как вы объяснили, что играете вокруг и хотите научиться делать это с помощью триггера, вот как будет выглядеть код:
create or replace trigger biufer_customer
before insert or update
of f_name on customer
for each row
begin
if (length(:new.f_name) <> 8)
then raise_application_error(-20001,'So I type my text here');
end if;
end;
В коде триггера вы можете использовать псевдотаблица :new
для доступа к значениям, которые в данный момент обновляются или вставляются; вы бы завернули проверку в оператор if
и соответственно подняли бы ошибку.