Когда я открываю источник View, пункт "NOFORCE" исчезает
Я создал случайный вид, как это:
CREATE OR REPLACE NOFORCE VIEW TEMP_VIEW (first_name, age) AS
SELECT 'Gladiolus' first_name, 23 age
FROM dual
/
И я проверяю это:
SELECT * FROM temp_view
/
FIRST_NAME AGE
---------- ----------
Gladiolus 23
Теперь, когда я открываю исходный код для его редактирования (с помощью PLSQL Developer и SQL Navigator), я получаю следующее:
CREATE OR REPLACE VIEW TEMP_VIEW AS
SELECT 'Gladiolus' first_name, 23 age
FROM dual;
Псевдоним (first_name, age)
опущен, потому что они равны столбцам подзапроса.
Но можете ли вы сказать мне, почему пункт NOFORCE
тоже не показали?
Спасибо!!
2 ответа
Некоторые ключевые слова управляют созданием объектов, но они не являются частью определения объекта. Oracle не всегда заботится о том, "как" объект был создан, и не всегда хранит параметры, использованные для его создания.
Когда Oracle и сторонние инструменты создают оператор DDL, они должны угадать, какую из этих опций вы хотели бы использовать. Инструменты нередко делают разные предположения или имеют небольшие синтаксические различия.
(Это одна из многих причин хранить все DDL в текстовых файлах с управлением версиями вместо базы данных. То, что вы помещаете в базу данных, НЕ будет таким же, как то, что вы получаете.)
Чтобы использовать ваш пример по-другому:
SQL> CREATE NOFORCE VIEW TEMP_VIEW (first_name, age) AS
2 SELECT 'Gladiolus' first_name, 23 age
3 FROM dual
4 /
View created.
Представление было создано с NOFORCE
и без OR REPLACE
, Но DDL генерируется DBMS_METADATA.GET_DDL
содержит FORCE
, OR REPLACE
и другие отличия:
SQL> select dbms_metadata.get_ddl('VIEW', 'TEMP_VIEW') from dual;
DBMS_METADATA.GET_DDL('VIEW','TEMP_VIEW')
--------------------------------------------------------------------------------
CREATE OR REPLACE FORCE EDITIONABLE VIEW "JHELLER"."TEMP_VIEW" ("FIRST_NAME",
"AGE") AS
SELECT 'Gladiolus' first_name, 23 age
FROM dual
Настоящий "источник" объекта не содержит ни одного из CREATE
варианты вообще:
SQL> select text from dba_views where view_name = 'TEMP_VIEW';
TEXT
--------------------------------------------------------------------------------
SELECT 'Gladiolus' first_name, 23 age
FROM dual
Вот неполный список вещей, которые могут отличаться при регенерации кода из баз данных Oracle:
OR REPLACE
FORCE
|NOFORCE
AND RESOLVE
|AND COMPILE
(для Java)- Пробелы
- случай
- Списки столбцов
- Двойные кавычки
- Терминаторы
Различные генераторы DDL позволяют вам управлять некоторыми из этих опций, но, по моему опыту, ни один из них не позволяет вам полностью контролировать все из них.
NOFORCE
по умолчанию, поэтому его сохранение является избыточным.