oracle - создать вид с первичным ключом - PullRequest
3 голосов
/ 06 февраля 2012

Этот вопрос является дублирующим по значению, но я должен его уточнить. В документации Oracle, в частности, говорится, , что можно указать первичный ключ в предложении CREATE VIEW (11g docs имеет такое же понятие). Тем не менее, когда я пытаюсь сделать это так:

create or replace view ABC(A, B, C, CONSTRAINT A_PK PRIMARY KEY (A)) ....

Я получаю ORA-00922: missing or invalid option, указывая на фразу "первичный ключ". Вопрос в том, это я или что-то не так с Oracle Documentation?

Ответы [ 2 ]

9 голосов
/ 06 февраля 2012

Простой ответ: ваш синтаксис неверен. Вы должны указать DISABLE.

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

rely является необязательным; он указывает, следует ли учитывать первичный ключ при создании представления. Антоним rely - norely.

Существует множество ограничений на создание ограничения представления, и, поскольку оно опирается на таблицу ниже, на самом деле оно того не стоит, как уже отмечалось @RC. Но если вам это нужно только для документации, тогда вы идете:

SQL> create table tmp_test ( a number(10), b varchar2(120) );

Table created.

SQL>
SQL> insert into tmp_test
  2   select level, 'b'
  3     from dual
  4  connect by level <= 20
  5          ;

20 rows created.

SQL>  commit ;

Commit complete.

SQL>
SQL> alter table tmp_test
  2    add constraint tmp_test_pk
  3        primary key (a)
  4        using index;

Table altered.

SQL>
SQL> create or replace view v_tmp_test (a, b
  2     , constraint v_tmp_test_pk primary key (a) rely disable novalidate) as
  3   select a, b
  4     from tmp_test
  5          ;

View created.

SQL>

Из документации :

Просмотр ограничений

Oracle не применяет ограничения представления. Однако операции над представлениями подлежат ограничениям целостности, определенным на основе базовые таблицы. Это означает, что вы можете наложить ограничения на представления сквозные ограничения на базовые таблицы.

Примечания к ограничениям просмотра Ограничения просмотра - это подмножество таблиц ограничения и подлежат следующим ограничениям:

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

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

Параметры RELY и NORELY являются необязательными. Посмотреть ограничения, потому что они не применяются, обычно задаются параметром RELY для сделать их более полезными. Ключевое слово RELY или NORELY должно предшествовать ОТКЛЮЧИТЬ ключевое слово. Пожалуйста, обратитесь к «Положению РЕЛИ» для получения дополнительной информации.

Поскольку ограничения вида не применяются напрямую, вы не можете указать ПЕРВОНАЧАЛЬНО ЗАДЕРЖАНО или ОТЛОЖЕНО.

Вы не можете указать using_index_clause, исключение_clause предложение или предложение ON DELETE в файле reference_clause.

Нельзя определить ограничения вида для атрибутов столбца объекта.

3 голосов
/ 06 февраля 2012

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

Целостность данных обеспечивается на уровне базовой таблицы. Когда вы думаете об этом, применение ограничения первичного ключа на уровне представления не имеет большого смысла. Обычное представление ole не хранит данные, это просто «представление» данных, предоставленных другими таблицами. Если ограничение первичного ключа было наложено только на представление некоторой базовой таблицы, и эта таблица не применяет само ограничение, как бы представление обрабатывало ситуацию, когда кто-то обновлял таблицу непосредственно данными, нарушающими ее ограничение? (то есть таблица не имеет представления о том, какие ограничения накладываются на нее через представление)

...