4

私はかなり長い間 MySQL を使用しており、Postgres を学ぶことにしました。移行はそれほどひどいものではありませんでしたが、今日問題が発生しました。

管理者アカウント とpostgres、このアプリケーション専用のユーザー がありますtv。便宜上、admin アカウントの下のテーブルのいくつかの行を変更していました。Web サイトには、データベースに加えた変更が反映されませんでした。

さまざまなキャッシング戦略を約 1 時間非難した後、最終的にユーザーとして実行psqltvたところ、そこにある行のどれもとしてログイン中に行われた変更を反映していないことに気付きましたpostgres。MySQL のバックグラウンドを持っているため、この動作は完全に不可解でした。

簡単に言えば、これは機能ですか、それともどこかで何かを誤って設定しましたか? データベースがこのように動作しないようにする方法はありますか?

助けてくれてありがとう。


更新:コマンドのサンプルを次に示します。

[12:23:04] blake$ sudo -u postgres psql -d teevee
psql (9.1.3)
ヘルプについては、「ヘルプ」と入力してください。

teevee=# SELECT COUNT(*) FROM エピソード;
 カウント
-------
     1
(1行)
[12:23:25] blake$ psql -U tv -d teevee -h localhost -W
ユーザー tv のパスワード:
psql (9.1.3)
SSL 接続 (暗号: DHE-RSA-AES256-SHA、ビット: 256)
ヘルプについては、「ヘルプ」と入力してください。

teevee=> SELECT COUNT(*) FROM エピソード;
 カウント
-------
   176
(1行)
4

1 に答える 1

4

\dnを使用して、またはその\dn+下でスキーマを一覧表示できますpsqlが、より適切な視覚的表現を得るには、pgAdminなどのツールを使用することをお勧めします。とを使用して、それらの潜在的なスキーマtvとスキーマに競合するテーブルがあるかどうかを確認できます。public\dt public.*\dt tv.*

複数のスキーマを使用すると便利な場合がありますが、多くの場合、必須ではありません。

デフォルトの検索パスはである傾向があります。これは、最初にユーザーにちなんで名付けられたスキーマのテーブルを使用しようとし、スキーマ(最も一般的)"$user",publicにフォールバックすることを意味します。public

public正当な理由がない限り、一般的にスキーマを使用することをお勧めします。通常、これがデフォルトになります。(なぜ別のスキーマがあったのかわかりません。)

を使用しALTER TABLE xxxxxx SET SCHEMA yyyyyyyてテーブルスキーマを変更できますが、名前が競合する他のスキーマを事前に削除する必要がある場合があります。確かに、最初にデータをコピーすることをお勧めします。

INSERT INTO public.episode SELECT * FROM tv.episodeあなたのケースでは、列名を指定すると、次のようなものが機能するはずです。これが機能するかどうかは、他の制約に依存する可能性があります。

public現時点でスキーマに役立つものがない場合は、スキーマを完全に削除して( DROP SCHEMA public)、もう一方の名前を変更することもできます(ALTER SCHEMA tv RENAME to public)。すでに付与されているものによっては、次のようなものも必要になる場合があります。

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
于 2012-05-11T17:51:51.900 に答える