2010-01-14 2 views
1

У нас есть мнение, что это определено как этотКак автоматически переопределить представление при изменении базовой таблицы (новый столбец)?

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

«ценность» в представлении находится в где-состоянии, поэтому хорошо использовать Select * в этом случае.

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

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

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

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

ответ

3

Этот дополнительный шаг является обязательным в 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 
+0

Что относительно других баз данных? – Thorsten

1

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

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

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

+1

Я не совсем с тобой согласен. a. Как отмечалось выше, я думаю, что в этом случае выбор * допустим. b. Я думаю, что RDBMS отлично справляются с проблемами компиляции для триггеров процедур и т. Д., Которые также зависят от структур таблиц и делают недействительными неправильные объекты. Кроме того, представление становится недействительным, если нужный столбец в базовой таблице удаляется, поэтому почему бы не иметь возможность обрабатывать вещи по-другому? – Thorsten

0

Проблема с автоматически обновляя представления, чтобы добавить столбцы приходит, когда вы расширяете свою модель, например,

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 таблицу, то вы, вероятно, должны использовать синоним или напрямую обращаться к таблице.

Если точка зрения Скрытие строк (SELECT * FROM таблицы WHERE ...), то вы можете посмотреть на функции по-разному известный как мелкозернистый контроля доступа (FGAC), Row Level Security (RLS) или Virtual Private База данных (VPD).

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

+0

Может понадобиться еще один фон: я хочу определить представление со всеми «активными» записями из базовой таблицы. Предложение Where-Clause состоит из 5 разных условий с чем-то таким же громоздким, как «aCol Not in» (<8 values>) и т. Д. Это просто удобно (и последовательно) использовать для этого представление. Это не для «Безопасности». – Thorsten

4

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

Один из способов обновить вид с новой колонки заключается в использовании:

exec sp_refreshview MyViewName 
go 

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

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