【问题标题】:Postgres users see different dataPostgres 用户看到不同的数据
【发布时间】:2012-05-20 07:32:41
【问题描述】:

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

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

在责备我的各种缓存策略大约一个小时后,我终于以tv 用户身份运行psql,并注意到其中没有任何行反映以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 行)

【问题讨论】:

  • 您所描述的似乎几乎不可能。您确定要更改同一数据库中的行吗?在 99% 的这种情况下,它被证明是错误的连接。 psql 默认使用以用户命名的数据库,除非您指定其他内容。请向我们展示您用于以 postgres 用户和 tv 用户启动 psql 的 exact 命令行。
  • 以防万一,搜索路径是否不同? (SHOW SEARCH_PATH; 您还可以使用\dn 列出psql 中可用的架构。)
  • 您可以发出select count(*) from public.episode; 来排除非默认搜索路径吗?
  • 哦,看起来他们在不同的架构上。 postgres 使用 public,tv 使用 tv。
  • tvpublic 两个架构中是否有同名表?

标签: postgresql


【解决方案1】:

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

使用多个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;

【讨论】:

  • 我有一个来自 MySQL 的 hacky 小导入脚本,它可能创建了额外的模式。 Drop、alter 和 grant 序列运行良好,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2019-02-19
相关资源
最近更新 更多