如何最好地更改 PostgreSQL 数据库及其表的所有者?

10

我正在尝试更改 PostgreSQL 数据库(版本 > 8.2)及其表的所有者。

我读到了这个解决方案:

在 PostgreSQL 中同时修改所有表的 OWNER

但是,这是现在最好的方法吗?似乎有一个函数 REASSIGN OWNED 更好,但这个函数会更改由 old_role 拥有的每个数据库,对吧?我只想更改一个数据库。

就像这篇帖子中所述:

REASSIGN OWNED BY 用于指定的 1 个数据库

我不打算更改 postgres 所拥有的所有者,这是现在最好的方法吗?

提前致谢

2个回答

12
根据手册的说明:

由于 REASSIGN OWNED 不会影响其他数据库中的对象,因此通常需要在每个数据库中执行此命令。

这似乎满足您的要求,尽管它还指出该命令会影响表空间(表空间不特定于当前数据库)。
您提供的第二个SO答案适用于postgres用户拥有系统目录的特殊情况。 您无法更改这些目录的所有权。

1
psql -h 127.0.0.1 -U postgres -W -d mydatabase -c "REASSIGN OWNED BY role_A TO role_B;" 对我来说不起作用。它会将所有数据库所有者从role_A更改为role_B。 - yucer

11

我能想到的两种方法是:

1)首先更改数据库名称,然后可能编写一个快速脚本,将当前表的所有者更改为旧表。

ALTER DATABASE <dbname> OWNER TO <newowner>;
\o altertable.sql
SELECT 'ALTER TABLE ' || table_name || ' OWNER TO <newowner>; ' FROM information_schema WHERE table_schema = <oldowner> and table_catalog = '<dbname>';
\o
\i altertable.sql

上述步骤将生成命令,只需将它们复制到文件中并执行即可。

2) 另一种选择是使用pg_dump以纯文本模式转储数据库,然后使用搜索和替换修改适当的字符串:

pg_dump -Fp -f dbbackup.dmp <dbname>
vi dbbackup.dmp
:%s/oldowner/newowner/g
save and exit
希望这可以帮助到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接