PostgreSQL 更改特定模式下所有表的所有者

Twi*_*ate 32 postgresql permissions

我正在尝试在一个命令行中更改同一架构下所有表的所有者。即:alter table schema_name.* owner to newowner。有没有办法做到这一点?

Eva*_*oll 29

重新分配拥有

有一个特定的权限命令可以做到这一点,RESASSIGN OWNED. 这会重新分配所有对象,而不仅仅是特定模式中的对象。

特定于模式

您可以ALTER TABLE使用以下命令生成命令,

SELECT format(
  'ALTER TABLE %I.%I.%I OWNER TO %I;',
  table_catalog,
  table_schema,
  table_name,
  current_user  -- or another just put it in quotes
)
FROM information_schema.tables
WHERE table_schema = 'mySchema';
Run Code Online (Sandbox Code Playgroud)

在 psql 中,您可以通过立即跟随它来运行它们 \gexec


小智 14

如果您可以查询架构中的表名,则可以生成查询以更改表所有权。

例如:

 select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;' 
 from  pg_tables t
 where t.tableowner != 'rdsadmin';
Run Code Online (Sandbox Code Playgroud)

将返回查询以更改所有表的所有权:

ALTER TABLE schema_version OWNER TO ali;
ALTER TABLE users OWNER TO ali; 
ALTER TABLE company OWNER TO ali;
ALTER TABLE books OWNER TO ali;
...
Run Code Online (Sandbox Code Playgroud)

那么你可以运行这些:)


jri*_*ial 8

我不知道有什么方法可以完全通过 psql 完成此操作,但是使用 bash,您可以使用以下命令列出数据库 $DB 中的表:

psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}
Run Code Online (Sandbox Code Playgroud)

所有权可以通过以下方式转让给 $OWNER:

psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}
Run Code Online (Sandbox Code Playgroud)

把它串在一起给你:

 $ for table in `psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}` ; do  psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB} ; done
Run Code Online (Sandbox Code Playgroud)

$DB、$SCHEMA 和 $OWNER 分别代表数据库、模式(通常是“公共”)和新所有者的名称。