2017-06-15 3 views
0

ソフトウェアをPostgreSQL 9.2から9.6にアップグレードする段階にあり、奇妙な問題が発生しました。PSQLがスキーマを推論していましたが、どうですか?

インストール時にSQLスクリプトが実行され、データベースが作成されます。これはpsql -fを使用して行われます。これは9.2で正常に動作しましたが、9.6でオブジェクトを作成しないという問題があるようです。私はこれを調べて、SQLスクリプトで何か奇妙なものを見つけました。 create table声明にはスキーマが存在しないこと

-- 
-- Name: crawler_run; Type: TABLE; Schema: analytics; Owner: postgres; Tablespace: 
-- 
CREATE TABLE IF NOT EXISTS crawler_run (
    ... columns, etc. 
); 

-- 
ALTER TABLE analytics.crawler_run OWNER TO postgres; 

注:テーブルのほとんどは、このようになりステートメントを使用して作成されます。しかし、テーブルは正しいスキーマで作成されており、その後のalter tableステートメントは失敗していませんでした。

これまでのコメントには関係がありますが、それをサポートするためのドキュメントが見つかりませんでした。

これはどのように機能しましたか?

+0

なぜそれがあなたのために働いたのかわかりませんが、テーブルを作成するときはまず最初にスキーマを修正するか、特定のスキーマのオーナー権限を変更する前にスキーマを変更する必要があります。まもなく:9.2がより寛大で、9.6で修正されましたが、ビルドスクリプトを正しく変更することをお勧めします:) –

+2

['SET search_path ...'](https://www.postgresql。 org/docs/current/static/ddl-schemas.html#DDL-SCHEMAS-PATH)ステートメントをスクリプトの先頭に挿入します。 – pozs

+0

@pozsあなたはそれを持っています。この声明はかなり上のものでしたが、それはトリックであるようです。ありがとう! –

答えて

2

テーブルは、永久に、または現在のセッションのためだけに設定された、ユーザー/ロールsearch_pathの最初のスキーマで作成されます。以下のような文の

ルック:あなたのケースでは

SET search_path = analytics 

それはanalyticsだったと今では戻ってデフォルトpublicにおそらくあります。

+0

ドキュメンテーションへのリンクと「検索パス」が意味するものの簡単な説明は、これを良い答えから素晴らしいものに変えることを意味します。 https://www.postgresql.org/docs/current/static/ddl-schemas.html#DDL-SCHEMAS-PATH – IMSoP

関連する問題