[postgresql] PostgreSQL의 모든 테이블에서 동시에 OWNER 수정

PostgreSQL 데이터베이스에서 모든 테이블의 소유자를 어떻게 수정합니까?

시도 ALTER TABLE * OWNER TO new_owner했지만 별표 구문을 지원하지 않습니다.



답변

REASSIGN OWNED명령 참조

참고 : 바와 같이 @trygvis는 아래의 대답에 언급REASSIGN OWNED명령은 적어도 버전 8.2부터 사용할 수 있으며, 훨씬 쉽게 방법이다.


모든 테이블의 소유권을 변경하고 있으므로 뷰와 시퀀스도 원할 것입니다. 내가 한 일은 다음과 같습니다.

테이블 :

for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" YOUR_DB` ; do  psql -c "alter table \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done

시퀀스 :

for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" YOUR_DB` ; do  psql -c "alter sequence \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done

견해:

for tbl in `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" YOUR_DB` ; do  psql -c "alter view \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done

alter 문이 세 가지 모두 동일하기 때문에 아마 조금 건조 시킬 수 있습니다.



답변

REASSIGN OWNED명령을 사용할 수 있습니다 .

개요:

REASSIGN OWNED BY old_role [, ...] TO new_role

이것은 소유 한 모든 객체 old_role를 새로운 역할로 변경합니다 . 사용자가 어떤 종류의 객체를 가지고 있는지 생각할 필요가 없으며 모두 변경됩니다. 단일 데이터베이스 내의 오브젝트에만 적용됩니다. 데이터베이스 자체의 소유자도 변경하지 않습니다.

8.2 이상으로 다시 사용할 수 있습니다. 그들의 온라인 문서는 그다지 거슬러 올라갑니다.


답변

이 : http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.php은 또한 좋은 빠른 솔루션이며, 하나의 데이터베이스에 여러 스키마에 대한 작동합니다 :

테이블

SELECT 'ALTER TABLE '|| schemaname || '.' || tablename ||' OWNER TO my_new_owner;'
FROM pg_tables WHERE NOT schemaname IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename;

시퀀스

SELECT 'ALTER SEQUENCE '|| sequence_schema || '.' || sequence_name ||' OWNER TO my_new_owner;'
FROM information_schema.sequences WHERE NOT sequence_schema IN ('pg_catalog', 'information_schema')
ORDER BY sequence_schema, sequence_name;

견해

SELECT 'ALTER VIEW '|| table_schema || '.' || table_name ||' OWNER TO my_new_owner;'
FROM information_schema.views WHERE NOT table_schema IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name;

구체화 된 뷰

이 답변을 바탕으로

SELECT 'ALTER TABLE '|| oid::regclass::text ||' OWNER TO my_new_owner;'
FROM pg_class WHERE relkind = 'm'
ORDER BY oid;

필요한 모든 ALTER TABLE/ ALTER SEQUENCE/ ALTER VIEW문을 생성 하고 복사하여 다시 plsql에 붙여 넣어 실행합니다.

다음을 수행하여 psql에서 작업을 확인하십시오.

\dt *.*
\ds *.*
\dv *.*


답변

하나의 SQL 문 에서이 작업을 수행하려면 http://wiki.postgresql.org/wiki/Dynamic_DDL에 언급 된대로 exec () 함수를 정의해야합니다 .

CREATE FUNCTION exec(text) returns text language plpgsql volatile
  AS $f$
    BEGIN
      EXECUTE $1;
      RETURN $1;
    END;
$f$;

그런 다음이 쿼리를 실행할 수 있습니다. 테이블, 시퀀스 및 뷰의 소유자가 변경됩니다.

SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' ||
            quote_ident(s.relname) || ' OWNER TO $NEWUSER')
  FROM (SELECT nspname, relname
          FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid)
         WHERE nspname NOT LIKE E'pg\\_%' AND
               nspname <> 'information_schema' AND
               relkind IN ('r','S','v') ORDER BY relkind = 'S') s;

$ NEWUSER는 새 소유자의 postgresql 새 이름입니다.

대부분의 경우이를 실행하려면 수퍼 유저 여야합니다. 소유자를 자신의 사용자에서 소속 된 역할 그룹으로 변경하면이를 피할 수 있습니다.

이 문제를 해결 한 #postgresql의 RhodiumToad 에게 감사드립니다 .


답변

최근에 데이터베이스에있는 모든 객체의 소유권을 변경해야했습니다. 테이블, 뷰, 트리거 및 시퀀스가 ​​다소 쉽게 변경되었지만 서명이 함수 이름의 일부이므로 함수에 대해 위의 접근 방식이 실패했습니다. 물론, 나는 MySQL 배경을 가지고 있으며 Postgres에 익숙하지 않습니다.

그러나 pg_dump를 사용하면 스키마 만 덤프 할 수 있으며 여기에는 ALTER xxx OWNER TO yyy가 포함됩니다. 필요한 진술. 여기 주제에 관한 쉘 마법이 있습니다.

pg_dump -s YOUR_DB | grep -i 'owner to' | sed -e 's/OWNER TO .*;/OWNER TO NEW_OWNER;/i' | psqL YOUR_DB


답변

매우 간단합니다.

 select 'ALTER TABLE ' || table_name || ' OWNER TO myuser;' from information_schema.tables where table_schema = 'public';


답변

매우 간단합니다

  1. su-postgres
  2. psql
  3. [old_user]가 [new_user]에게 재 지정;
  4. \ c [귀하의 데이터베이스]
  5. [old_user]가 [new_user]에게 재 지정;

끝난.