Postgresqlでテーブルの名前を変更すると、自動的に名前を変更したテーブルを使用するビューのVIEW定義も名前が変更されることを今日知りました。これをオフにする方法はありますか?
だから私はテーブルの名前を次のように変更します:
ALTER TABLE xyz RENAME TO abc;
例として、私のVIEW定義は次のとおりです。
CREATE VIEW foo AS SELECT * FROM xyz;
次に、テーブルの名前を変更した後、fooの定義がテーブルabcを指すように変更されました。
私はPostgresql 8.4を使用しています
-更新:2014年12月30日午後12:41-
ここに私が何を意味するかを説明するためのテストケースがあります:
CREATE TABLE tmp_test_a (num integer);
CREATE VIEW v_tmp_test_a AS SELECT * FROM tmp_test_a;
-- Now look at what the VIEW is using (now is using tmp_test_a, which is what it should be using):
SELECT pg_get_viewdef('v_tmp_test_a'::regclass, false);
-- Now create a second table, and swap them.
CREATE TABLE tmp_test_b (num integer);
ALTER TABLE tmp_test_a RENAME TO tmp_test_c;
ALTER TABLE tmp_test_b RENAME TO tmp_test_a;
ALTER TABLE tmp_test_c RENAME TO tmp_test_b;
-- Now look at what the VIEW is using again (now is using tmp_test_b with an alias of tmp_test_a)
SELECT pg_get_viewdef('v_tmp_test_a'::regclass, false);
-- Cleanup
DROP VIEW v_tmp_test_a;
DROP TABLE tmp_test_a;
DROP TABLE tmp_test_b;
単純な答え-ビューはOIDを参照し、オブジェクト名を参照しないため。名前は内部関数に変換されます。
PostgreSQLのビューは、select rewriteルールを持つ空のテーブルと考えることができます。この例では、書き換えルールの内部クエリツリーはpg_rewrite.ev_action
テーブル/列にあり、個々のテーブルと列のOIDへの参照が表示されます。
私が行うことをお勧めするのは、テーブルの名前変更とCREATE OR REPLACE VIEW
ステートメントを単一のトランザクションで囲むことです。これにより、すべてが比較的シームレスになり、新しいテーブルのOIDを指すビューが再作成されます。