1つのコマンドラインで同じスキーマの下にあるすべてのテーブルの所有者を変更しようとしています。つまり、alter table schema_name.* owner to newowner
。それを達成する方法はありますか?
これだけを行う特定の特権コマンド 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
をすぐに使用して実行できます。
スキーマ内のテーブル名をクエリできる場合は、テーブルの所有権を変更するクエリを生成できます。
例えば:
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;
...
次に、これらを実行するだけです:)
純粋に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は、それぞれデータベース、スキーマ(通常は「パブリック」)、および新しい所有者の名前を表します。
このスクリプトでうまくいきます。
sh change_owner.sh -n new_owner -S schema_name
sh change_owner.sh -n user1 -S public
Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2
これは、スキーマのテーブル、ビュー、関数の所有権を変更するために使用する関数です。これは高速でクリーンであり、カーソルの使用方法の良い例でもあります。また、コマンドラインは必要ありません。
次の例では、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;
上記と同様に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