특정 스키마에서 모든 테이블의 PostgreSQL Change 소유자


19

하나의 명령 줄에서 동일한 스키마 아래의 모든 테이블 소유자를 변경하려고합니다. 즉 : 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는 각각 데이터베이스, 스키마 (일반적으로 'public') 및 새 소유자 이름을 나타냅니다.


7

스키마에서 테이블 이름을 쿼리 할 수 ​​있으면 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;
...

그럼 당신은 이것들을 실행할 수 있습니다 :)



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.