Как автоматически переопределить представление при изменении базовой таблицы (новый столбец)? - PullRequest
2 голосов
/ 14 января 2010

У нас есть представление, которое определено так

CREATE VIEW aView as 
SELECT * from aTable Where <bunch of conditions>;

«Значение» представления находится в условии where, поэтому в этом случае можно использовать Select *.

Когда новый столбец добавляется в базовую таблицу, мы должны переопределить представление с помощью

CREATE OR REPLACE FORCE VIEW aView as 
SELECT * from aTable Where <bunch of conditions>;

поскольку Select * кажется "переведенным" во все столбцы, присутствующие во время (пере) определения представления.

Мой вопрос: как мы можем избежать этого дополнительного шага? (Если ответ зависит от СУБД, мы используем Oracle.)

Ответы [ 4 ]

4 голосов
/ 31 октября 2012

Я знаю, что вы указали Oracle, но поведение в SQL Server такое же.

Один из способов обновить представление новым столбцом - использовать:

exec sp_refreshview MyViewName
go

Конечно, я также согласен с другими комментариями об отсутствии использования SELECT * в определении представления.

3 голосов
/ 14 января 2010

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

Как вы заметили, "*" теряется, когда вы создаете представление:

SQL> create table t (id number);

Table created

SQL> create view v as select * from t;

View created

SQL> select text from user_views where view_name = 'V';

TEXT
-------------------------------------------------------
select "ID" from t
1 голос
/ 14 января 2010

Вы не должны использовать * в своих представлениях. Укажите столбцы явно.

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

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

0 голосов
/ 15 января 2010

Проблема с автоматическим обновлением видов для добавления столбцов возникает при расширении модели, например до

SELECT a.*, std_name_format(a.first_name, a.middle_names, a.last_name) long_name

или даже

SELECT a.*, b.* from table_a a join table_b b....

Если вы видите только SELECT * FROM table , то вам, вероятно, следует использовать синоним или обратиться к таблице напрямую.

Если представление скрывает строки ( SELECT * FROM table WHERE ... ), то вы можете взглянуть на функцию, известную как Детальный контроль доступа (FGAC), Безопасность на уровне строк (RLS) или виртуальная частная база данных (VPD).

Возможно, вы сможете что-то сделать с помощью триггера DDL, но это будет сложно.

...