Oracle PLSQL триггер - PullRequest
       20

Oracle PLSQL триггер

0 голосов
/ 07 ноября 2019

Как разрешить пользователю вставлять строки в реляционную таблицу только один раз в день?

CREATE OR REPLACE TRIGGER trigger_name
BEFORE INSERT ON Table_name
declare date[type?]
count int := 0;
BEGIN
if(00:00 to sysdate)
END IF
END

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

@ 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; 
0 голосов
/ 07 ноября 2019

Зачем использовать триггер, когда вы можете использовать ограничение?

create table t (
  c1       int,
  ins_date date default sysdate,
  ins_day  date as ( trunc ( ins_date ) ),
  constraint one_per_day unique ( ins_day )
);

insert into t ( c1 )
  values ( 1 );

insert into t ( c1 )
  values ( 2 );

ORA-00001: unique constraint (CHRIS.ONE_PER_DAY) violated

select * from t;

C1    INS_DATE              INS_DAY                
    1 07-NOV-2019 09:31:14  07-NOV-2019 00:00:00 
...