2

このように定義されたビューがあります

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

ビューの「値」は where 条件にあるためSelect *、この場合は a を使用しても問題ありません。

基になるテーブルに新しい列が追加されると、ビューを再定義する必要があります

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

Select *ビューが(再)定義された時点で存在するすべての列に「変換」されるように見えるためです。

私の質問: この余分な手順を回避するにはどうすればよいですか? (答えが RDBMS に依存している場合は、Oracle を使用しています。)

4

4 に答える 4

4

Oracle を指定したことは知っていますが、動作は SQL Server でも同じです。

新しい列でビューを更新する 1 つの方法は、次を使用することです。

exec sp_refreshview MyViewName
go

もちろん、ビュー定義で SELECT * を使用しないという他のコメントにも同意します。

于 2012-10-31T15:43:15.350 に答える
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
于 2010-01-14T10:50:54.927 に答える
1

*ビューで使用しないでください。列を明示的に指定します。

こうすることで、必要なデータのみを取得することができるため、そのビューで返してほしくない列を誰かがテーブルに追加するという潜在的な問題 (たとえば、パフォーマンスに悪影響を与える大きなバイナリ列) を回避できます。

はい、ビューを再コンパイルして別の列を追加する必要がありますが、これは正しいプロセスです。こうすることで、ビューが 2 つのテーブルを参照し、誰かがテーブルの 1 つに重複した列名を追加した場合など、他のコンパイルの問題を回避できます。コンパイラは、列への参照の前にテーブル エイリアスを付けないと、どの列が参照されているかを判断する際に問題が発生するか、結果に重複する列名がある場合にエラーが発生する可能性があります。

于 2010-01-14T14:48:59.243 に答える
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 tableだけのビューがある場合は、おそらくシノニムを使用するか、テーブルを直接指定する必要があります。

ビューが行を非表示にしている場合 ( SELECT * FROM table WHERE... )、Fine Grained Access Control (FGAC)、Row Level Security (RLS)、または Virtual Private Database (VPD) としてさまざまに知られている機能を確認できます。

DDL トリガーを使用して何かを実行できる場合もありますが、それは複雑になります。

于 2010-01-14T21:43:24.580 に答える