Postgres用户可以看到不同的数据

时间:2012-05-11 17:16:54

标签: postgresql

我已经使用MySQL很长一段时间了,我决定学习Postgres。过渡并不是很糟糕,但我今天遇到了障碍:

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

在将我的各种缓存策略归咎于大约一个小时之后,我终于以psql用户身份运行tv并注意到其中没有任何行反映了以{{1}身份登录时所做的更改}。来自MySQL背景,这种行为让我感到困惑。

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

感谢您的帮助。

<小时/> 更新:以下是一些命令示例:

[12:23:04] blake$ sudo -u postgres psql -d teevee
psql (9.1.3)
Type "help" for help.

teevee=# SELECT COUNT(*) FROM episode;
 count
-------
     1
(1 row)
[12:23:25] blake$ psql -U tv -d teevee -h localhost -W
Password for user tv:
psql (9.1.3)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

teevee=> SELECT COUNT(*) FROM episode;
 count
-------
   176
(1 row)

1 个答案:

答案 0 :(得分:4)

您可以在\dn下使用\dn+psql列出架构,但我建议您使用像pgAdmin这样的工具来获得更好的直观表示。您可以使用tvpublic查找这些潜在的\dt public.*\dt tv.*架构中是否存在冲突表。

使用多个schemas可能很有用,但通常不需要。

默认搜索路径往往是"$user",public,这意味着它将首先尝试使用以用户命名的模式中的表,并回退到public模式(最常见)

我建议一般使用public架构,除非你有充分的理由不这样做。这通常应该是默认值。 (我不确定为什么你有另一个架构。)

您可以更改表架构using 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;