我如何只允许用户每天只在关系表中插入一行?
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
为什么可以使用约束时使用触发器?
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
,
@ChrisSaxon具有创建约束而不是尝试触发的正确想法。它不仅更清洁,而且可以工作,而触发器将不起作用(无论如何都是干净的)。任何尝试强制执行此操作的触发器都需要从同一张表中进行选择,从而导致表发生变异(ora-04091),或者需要使用:(复合触发器:(。但是我们可以进一步考虑Chris的建议,将ins_day列设为虚拟列,也如您所指出的“允许 user 每天仅将行插入关系表一次”表示您每天可以有多个条目,但不能相同的用户。将这些内容合并后,我们得出:
create table test_1per_user_day (
t1pd_id integer,user_id integer,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,ins_date,vir_1per_day) values (1,sysdate-1,sysdate);
insert into test_1day(t1pd_id,user_id) values (2,2);
insert into test_1day(t1pd_id,2);
update test_1day set vir_1per_day = sysdate;