docは、依存オブジェクトを無効にせずにビューで参照されていない列を変更または削除できるように、各テーブルをビューで参照します。私はこれが実際に意味をなさない単一のケースを見つけることはできません。スキーマオブジェクトの依存関係:無効化を減らすためのdocに記載されているガイドラインは実際には意味がありますか?
従属オブジェクトがテーブル内の特定の列を参照している場合、他の列を変更または削除すると、実際にはview
または間接的に依存オブジェクトのステータスは変更されません。
docは、依存オブジェクトを無効にせずにビューで参照されていない列を変更または削除できるように、各テーブルをビューで参照します。私はこれが実際に意味をなさない単一のケースを見つけることはできません。スキーマオブジェクトの依存関係:無効化を減らすためのdocに記載されているガイドラインは実際には意味がありますか?
従属オブジェクトがテーブル内の特定の列を参照している場合、他の列を変更または削除すると、実際にはview
または間接的に依存オブジェクトのステータスは変更されません。
依存オブジェクトが変更、テーブル内の特定の列を参照するか、依存オブジェクトの状態を変更しない、本当に他の列を削除した場合...
確かに、しかし、あなたがしている場合ではありません列を明示的に参照していますか?あなたの前の質問からセットアップを使用して
は、ここでそれは意味を作ることができる例を示します。この時点で
create table test (num1 number, num2 number);
create or replace procedure refvirew_intab is
begin
for r in (select * from test) loop
dbms_output.put_line(r.num1);
end loop;
end;
/
3つのすべてのオブジェクトが有効です。列が付加し直される場合
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
REFVIREW_INTAB PROCEDURE INVALID
TEST TABLE VALID
VEXTEST VIEW VALID
及び手順が代わりにビューに対して作成されます:このプロシージャは無効化され
alter table test drop column num2;
:私は未使用num2
列を削除した場合
create or replace view vextest as (select num1 from test);
create or replace procedure refvirew_intab is
begin
for r in (select * from vextest) loop
dbms_output.put_line(r.num1);
end loop;
end;
/
テーブルを変更しても効果はありません:
alter table test drop column num2;
Table TEST altered.
select object_name, object_type, status
from user_objects
where object_name in ('TEST' ,'VEXTEST', 'REFVIREW_INTAB')
order by object_name;
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
REFVIREW_INTAB PROCEDURE VALID
TEST TABLE VALID
VEXTEST VIEW VALID
あなたがすでに知っているように、これはselect *
でのみ動作します。テーブルのバージョンがselect num1
の場合、2番目の列を削除しても問題は解決しません。そして、select *
を使用して、眉をひそめます。この状況では、プロシージャは自動的に再コンパイルされ、削除された列への参照が実際に存在しない限り正常に再コンパイルされます。
もう一つのシナリオは、前の例のように、列名を指定せずにテーブルに挿入している場合です。その場合、テーブル定義を変更すると、プロシージャーは無効になります。異なる数/順序/タイプの列で終了すると、正常に再コンパイルされないため、かなり致命的です。 instead of
トリガを使用してビューに挿入していた場合、プロシージャは気にしません。 (トリガーは、で、実行していた内容に応じてが再コンパイルされない可能性があります)。これは、ドキュメントの最初の箇条書きに関連していますが、あなたが求めているのはもう1つはありません。列の削除にも適用されます。
これは本当に有益な助言かどうかは議論の余地があります。 select *
を使用する人や、列名を指定せずに挿入する人がいると確信しています。また、そのようなときどきの副作用を避けるためにビューを使用する人もいます。私は、従属オブジェクトの無効化の可能性を避けるためのビューの層が余分な管理に値するシナリオを見ることができるかどうかはわかりませんが、おそらく一部の人はそうします。
一時的であっても、オブジェクトが無効になっているのを見ているならば、通常、スキーマの変更は計画された制御された方法で行われ、副作用が適切に処理されます。しかし、やはり他の人は、異なる意見と優先順位を持っています。
ビューを通してすべてを行うためのドキュメントのガイドラインはばかげているので無視してください。
私はこれらのガイドラインに従う人は見たことがありません。オラクルではありません。 Oracleのマニュアルは通常素晴らしいですが、すべてのマニュアルにはいくつかの間違いや奇妙な意見が含まれています。
良いプログラムは、間接化のレベルとオブジェクトの数を最小限に抑えます。 の上にある余分なレイヤーには正当な理由が1つ必要です。とにかく悪いプログラミング慣行によってのみ引き起こされるいくつかの奇妙なケースを避けることは、ビューの余分な複雑さを正当化するのに十分ではありません。