web-dev-qa-db-ja.com

ビュー定義を更新せずにPostgresqlのテーブル名を変更する

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;
6
Pyrite

単純な答え-ビューはOIDを参照し、オブジェクト名を参照しないため。名前は内部関数に変換されます。

PostgreSQLのビューは、select rewriteルールを持つ空のテーブルと考えることができます。この例では、書き換えルールの内部クエリツリーはpg_rewrite.ev_actionテーブル/列にあり、個々のテーブルと列のOIDへの参照が表示されます。

私が行うことをお勧めするのは、テーブルの名前変更とCREATE OR REPLACE VIEWステートメントを単一のトランザクションで囲むことです。これにより、すべてが比較的シームレスになり、新しいテーブルのOIDを指すビューが再作成されます。

5
Nathan Clayton