답변:
이 작업을 수행하는 특정 권한 명령이 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
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') 및 새 소유자 이름을 나타냅니다.
스키마에서 테이블 이름을 쿼리 할 수 있으면 ALTER 테이블 소유권에 대한 쿼리를 생성 할 수 있습니다.
예를 들면 다음과 같습니다.
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;
...
그럼 당신은 이것들을 실행할 수 있습니다 :)
이 스크립트는 트릭을 수행합니다.
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
위의 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
이것은 스키마에서 테이블, 뷰 및 함수 소유권을 변경하는 데 사용하는 함수입니다. 빠르고 깨끗하며 커서 사용법도 좋은 예입니다. 또한 명령 줄이 필요하지 않습니다.
다음은 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;