2014-02-14 3 views
0

Я думал, что я хотел бы иметь «отложенный проверочное ограничение» в Postgres, но это, по-видимому not supported at this time (Postgres 9.3)Возможно ли иметь «отложенное ограничение проверки» в Oracle?

Потом я увидел, что Oracle, кажется, в целом были «отложены» для его ограничения, задокументировано here. Поэтому верно ли, что Oracle 10g + поддерживает наличие «отложенного контрольного ограничения»?

Возможно, я пропустил дальнейшую документацию, поэтому я решил задать здесь как двойную проверку, полагая, что есть люди, которые активно используют Oracle, который знал бы ответ - таким образом, избегая проб и ошибок, часами возиться с серверами Oracle.

ответ

2

Да , хотя я Не уверен, почему вы хотите:

create table t42 (id number, 
    constraint check_id check (id > 0) initially deferred deferrable); 

table T42 created. 

insert into t42 (id) values (-1); 

1 rows inserted. 

commit; 

Error report - 
SQL Error: ORA-02091: transaction rolled back 
ORA-02290: check constraint (STACKOVERFLOW.CHECK_ID) violated 
02091. 00000 - "transaction rolled back" 
*Cause: Also see error 2092. If the transaction is aborted at a remote 
      site then you will only see 2091; if aborted at host then you will 
      see 2092 and 2091. 
*Action: Add rollback segment and retry the transaction. 

Вы можете обновить его до совершения курса:

insert into t42 (id) values (-1); 

1 rows inserted. 

update t42 set id = 1 where id = -1; 

1 rows updated. 

commit; 

committed. 

... но я не знаю, почему вы бы поставить недопустимое значение в таблице, в первую очередь, если вы планируете ее обновить. Предположительно, есть некоторый сценарий, где это полезно.

Подробнее об ограничении отсрочки in the documentation.

+0

Я использую отложенные ограничения, когда 2 столам нужно FK друг к другу. Это очень строгое ограничение fk. Я использовал его несколько раз ... почти никогда. –

+0

@BrianMcGinity - это использование отложенных * контрольных * ограничений, которые я озадачен, а не отсрочки вообще. Я думаю, что я только видел, как FK откладываются. –

+0

О, это странно ... Я не могу придумать другую причину, чем то, что вы наметили. Если вы не знаете значения в insert, тогда сделайте что-нибудь, чтобы найти значение, затем обновите таблицу до фиксации ... hmmm ... не могу думать о другой причине ... –

1

Да, вы можете определить, как Constraint

"DEFERRABLE" or "NOT DEFERRABLE" 

, а затем

"INITIALLY DEFERRED" or "INITIALLY IMMEDIATE" 

Например:

ALTER TABLE T 
ADD CONSTRAINT ck_t CHECK (COL_1 > 0) 
DEFERRABLE INITIALLY DEFERRED; 

Check Oracle документации для деталей ...

Смежные вопросы