PostgreSQL特定のスキーマ下のすべてのテーブルの所有者を変更します


19

1つのコマンドラインで同じスキーマのすべてのテーブルの所有者を変更しようとしています。すなわち:alter table schema_name.* owner to newowner。それを達成する方法はありますか?

回答:


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は、それぞれデータベース、スキーマ(通常は「パブリック」)、および新しい所有者の名前を表します。


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

上記と同様にbashを使用しますが、テキストファイルで出力してからpsqlに入力する必要がありました。

$ psql -qAt -d mydatabase -c "SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' \
                                      OWNER TO new_owner;' \
                                      FROM pg_tables \
                                      WHERE schemaname = 'myschema'" > data.txt


$ psql < data.txt -d mydatabase

これに基づきますが、データベースが追加されました:http : //penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html


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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.