4

我使用 MySQL 已经有一段时间了,我决定学习 Postgres。过渡并不可怕,但我今天遇到了一个障碍:

我有管理员帐户postgres和专门用于此应用程序的用户tv。为了方便起见,我正在修改管理员帐户下的表中的一些行。该网站不会反映我对数据库所做的任何更改。

在责备我的各种缓存策略大约一个小时后,我终于psqltv用户身份运行,并注意到其中没有任何行反映以postgres. 来自 MySQL 背景,这种行为对我来说完全莫名其妙。

长话短说:这是一个功能,还是我在某个地方配置错误?有没有办法让数据库不这样?

谢谢你的帮助。


更新:以下是命令示例:

[12:23:04] blake$ sudo -u postgres psql -d teevee
psql (9.1.3)
键入“帮助”以获得帮助。

teevee=# SELECT COUNT(*) FROM episode;
 数数
--------
     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=> 从剧集中选择计数(*);
 数数
--------
   176
(1 行)
4

1 回答 1

4

您可以使用\dn\dn+下列出架构psql,但我建议使用 pgAdmin 之类的工具来获得更好的视觉表示。您可以使用和查找这些潜在tvpublic模式中是否有冲突的表。\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 回答