仅限表上的更新操作的约束

问题描述 投票:1回答:1

我有下表。

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),并在插入新行时忽略?

oracle
1个回答
3
投票

不是通过检查约束,而是通过数据库触发器。这是一个例子:

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>
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.