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


19

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

Answers:


11

重新拥有

有一个专门的特权命令可以执行此操作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';

在psql中,您可以通过以下命令立即运行它们 \gexec


8

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

psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}

所有权可以通过以下方式转移到$ OWNER:

psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}

将其串在一起将为您提供:

 $ 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

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


7

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

例如:

 select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;' 
 from  pg_tables t
 where t.tableowner != 'rdsadmin';

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

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;
...

那么你可以运行这些:)




0

我使用此函数来更改模式中的表,视图和函数所有权。它快速,干净并且是如何使用游标的一个很好的例子。另外,不需要命令行。

以下将通过plpgsql函数更改权限:

CREATE OR REPLACE FUNCTION YOURSCHEMA.do_changeowner(
    newowner text,
    pschem text)
  RETURNS void AS
$BODY$
declare
  tblnames CURSOR FOR
    SELECT tablename FROM pg_tables
    WHERE schemaname = pschem;
  viewnames CURSOR FOR
    SELECT viewname FROM pg_views
    WHERE schemaname = pschem;
  funcnames CURSOR FOR
    SELECT p.proname AS name, pg_catalog.pg_get_function_identity_arguments(p.oid) as params
    FROM pg_proc p 
    JOIN pg_namespace n ON n.oid = p.pronamespace 
    WHERE n.nspname = pschem;

begin

  FOR stmt IN tblnames LOOP
    EXECUTE 'alter TABLE ' || pschem || '.' || stmt.tablename || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN viewnames LOOP
    EXECUTE 'alter VIEW ' || pschem || '.' || stmt.viewname || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN funcnames LOOP
    EXECUTE 'alter FUNCTION ' || pschem || '.' || stmt.name || '(' ||  stmt.params || ') owner to ' || newowner || ';';
  END LOOP;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.