我有下表。
CREATE TABLE oferty (
idk number(10) NOT NULL,
model_id number(10) NOT NULL,
klient_id number(10) NOT NULL,
komis_id number(10) NOT NULL,
pracownik_id number(10) NOT NULL,
data_rozp date DEFAULT SYSDATE NOT NULL,
data_aktualizacji date DEFAULT SYSDATE NOT NULL,
data_konca date DEFAULT SYSDATE NOT NULL,
cena_bazowa decimal(10, 2) DEFAULT 0.0,
cena_aktualna decimal(10, 2) DEFAULT 0.0,
status varchar(1) NOT NULL,
CONSTRAINT oferty_pk PRIMARY KEY (idk),
CONSTRAINT status_chk CHECK (status in ('A', 'Z')),
CONSTRAINT daty_chk CHECK ( data_konca >= data_rozp)
);
是否可以仅为此表上的更新操作创建约束CONSTRAINT daty_chk CHECK ( data_konca >= data_rozp)
,并在插入新行时忽略?
不是通过检查约束,而是通过数据库触发器。这是一个例子:
SQL> create table oferty
2 (idk number primary key,
3 data_konca date default sysdate not null,
4 data_rozp date default sysdate not null);
Table created.
SQL>
SQL> create or replace trigger trg_of_bu
2 before update on oferty
3 for each row
4 begin
5 if not :new.data_konca >= :new.data_rozp then
6 raise_application_error(-20001, 'Data konca must be >= data rozp');
7 end if;
8 end;
9 /
Trigger created.
SQL>
测试:
SQL> -- insert; should be OK
SQL> insert into oferty(idk, data_konca, data_rozp)
2 values (1, date '2018-02-15', date '2018-02-25');
1 row created.
SQL> -- just the opposite
SQL> insert into oferty(idk, data_konca, data_rozp)
2 values (2, date '2018-02-25', date '2018-02-15');
1 row created.
SQL> -- update - this should fail
SQL> update oferty set data_konca = date '2018-01-01'
2 where idk = 1;
update oferty set data_konca = date '2018-01-01'
*
ERROR at line 1:
ORA-20001: Data konca must be >= data rozp
ORA-06512: at "SCOTT.TRG_OF_BU", line 3
ORA-04088: error during execution of trigger 'SCOTT.TRG_OF_BU'
SQL> -- update - this should be OK
SQL> update oferty set data_konca = date '2018-05-01'
2 where idk = 1;
1 row updated.
SQL>