我已经使用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)
答案 0 :(得分:4)
您可以在\dn
下使用\dn+
或psql
列出架构,但我建议您使用像pgAdmin这样的工具来获得更好的直观表示。您可以使用tv
和public
查找这些潜在的\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;