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';
답변
매우 간단합니다
- su-postgres
- psql
- [old_user]가 [new_user]에게 재 지정;
- \ c [귀하의 데이터베이스]
- [old_user]가 [new_user]에게 재 지정;
끝난.