@ ChrisSaxon имеет правильную идею создания ограничения вместо попытки триггера. Мало того, что он чище, он будет работать, тогда как триггер НЕ будет работать (в любом случае чисто). Любой триггер, пытающийся применить это, по необходимости должен был бы выбрать из той же таблицы, приводящей к исключению мутирующей таблицы (ora-04091), или должен быть: составной триггер :( :(. Но мы можем сделать предложение Криса еще дальшеСделайте столбец ins_day виртуальным столбцом. Также, как вы указали, «разрешить пользователю вставлять строки в реляционную таблицу только один раз в день» подразумевает, что вы можете иметь несколько записей в день, но не одним и тем же. пользователь. Включая их, мы получаем:
create table test_1per_user_day (
t1pd_id integer,
user_id integer,
ins_date date default sysdate,
vir_1per_day date GENERATED ALWAYS AS (trunc(ins_date)),
constraint t1d_one_per_day unique (user_id, vir_1per_day )
);
-- test run individually and stlect * from test_1per_day after each
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
insert into test_1day(t1pd_id, user_id) values (1,1);
insert into test_1day(t1pd_id, user_id, ins_date) values (1,1, sysdate-2);
insert into test_1day(t1pd_id, user_id, ins_date,vir_1per_day) values (1,1, sysdate-1,sysdate);
insert into test_1day(t1pd_id, user_id) values (2,2);
insert into test_1day(t1pd_id, user_id) values (2,2);
update test_1day set vir_1per_day = sysdate;