PostgreSQL: Postgre에서 모든 테이블의 OWNER 동시 수정SQL
Postgre의 모든 테이블 소유자를 수정하려면 어떻게 해야 합니까?SQL 데이터베이스?
나는 노력했다.ALTER TABLE * OWNER TO new_owner별표 구문을 지원하지 않습니다.
명령을 사용할 수 있습니다.
개요:
REASSIGN OWNED BY old_role [, ...] TO new_role
소한모개변경다니됩이 객체가 됩니다.old_role새로운 역할로.사용자가 어떤 종류의 물건을 가지고 있는지 생각할 필요가 없고, 그것들은 모두 바뀔 것입니다.단일 데이터베이스 내의 개체에만 적용됩니다.데이터베이스 소유자 자체도 변경하지 않습니다.
최소 8.2까지 다시 사용할 수 있습니다.그들의 온라인 문서는 그렇게 오래 전으로 거슬러 올라갑니다.
명령 참조
참고: @trygvis가 아래 답변에서 언급했듯이 이 명령은 최소한 버전 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
세 가지 모두에 대한 변경 문구가 동일하기 때문에 아마도 그것을 조금 건조시킬 수 있습니다.
다음은 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에 Toadon.
매우 간단합니다.
su - postgrespsqlREASSIGN OWNED BY [old_user] TO [new_user];\c [your database]REASSIGN OWNED BY [old_user] TO [new_user];
다 했어요.
함수를 만들지 않고 한 번에 특정 스키마의 테이블, 뷰, 시퀀스 및 함수 소유자를 수정하고 PgAdmin III 및 psql에서 직접 사용할 수 있기 때문에 이 기능이 좋습니다.
(PostgreSql v9.2에서 테스트됨)
DO $$DECLARE r record;
DECLARE
v_schema varchar := 'public';
v_new_owner varchar := '<NEW_OWNER>';
BEGIN
FOR r IN
select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.tables where table_schema = v_schema
union all
select 'ALTER TABLE "' || sequence_schema || '"."' || sequence_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.sequences where sequence_schema = v_schema
union all
select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.views where table_schema = v_schema
union all
select 'ALTER FUNCTION "'||nsp.nspname||'"."'||p.proname||'"('||pg_get_function_identity_arguments(p.oid)||') OWNER TO ' || v_new_owner || ';' as a from pg_proc p join pg_namespace nsp ON p.pronamespace = nsp.oid where nsp.nspname = v_schema
LOOP
EXECUTE r.a;
END LOOP;
END$$;
@rkj, @AlannaRose, @Sharoon이 제공한 답변을 기반으로 합니다.Thomas, @user3560574 그리고 @a_horse_with_no_name의 이 답변.
감사합니다.
더 나은 점:데이터베이스 및 스키마 소유자도 변경합니다.
DO $$DECLARE r record;
DECLARE
v_schema varchar := 'public';
v_new_owner varchar := 'admin_ctes';
BEGIN
FOR r IN
select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.tables where table_schema = v_schema
union all
select 'ALTER TABLE "' || sequence_schema || '"."' || sequence_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.sequences where sequence_schema = v_schema
union all
select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.views where table_schema = v_schema
union all
select 'ALTER FUNCTION "'||nsp.nspname||'"."'||p.proname||'"('||pg_get_function_identity_arguments(p.oid)||') OWNER TO ' || v_new_owner || ';' as a from pg_proc p join pg_namespace nsp ON p.pronamespace = nsp.oid where nsp.nspname = v_schema
union all
select 'ALTER SCHEMA "' || v_schema || '" OWNER TO ' || v_new_owner
union all
select 'ALTER DATABASE "' || current_database() || '" OWNER TO ' || v_new_owner
LOOP
EXECUTE r.a;
END LOOP;
END$$;
최근에 데이터베이스에 있는 모든 개체의 소유권을 변경해야 했습니다.테이블, 뷰, 트리거 및 시퀀스가 다소 쉽게 변경되었지만 서명이 함수 이름의 일부이기 때문에 위의 접근 방식은 함수에 대해 실패했습니다.물론, 저는 MySQL 경력이 있고 Postgres에 대해 잘 알지 못합니다.
그러나 pg_dump를 사용하면 스키마만 덤프할 수 있으며 여기에는 필요한 ALTER xxx OWNER Toyy; 문이 포함되어 있습니다.여기 이 주제에 대한 저의 약간의 셸 매직이 있습니다.
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';
현재 소유자가 게시자가 아닌 경우 다음을 사용할 수 있습니다.
REASSIGN OWNED BY old_role [, ...] TO new_role
그러나 현재 소유자가 postgres이면 분명히 오류가 발생하므로 @dvanrensburg answer를 사용해야 하지만 동일한 SQL에서 명령을 실행하려면 need에 따라 다음 명령을 사용합니다.
데이터베이스
ALTER DATABASE target_database OWNER TO new_onwer;
테이블
DO
LANGUAGE plpgsql
$$
DECLARE
stmt text;
BEGIN
FOR stmt IN
WITH temp as (
SELECT 'ALTER TABLE '|| schemaname || '."' || tablename ||'" OWNER TO newuser' as command
FROM pg_tables WHERE NOT schemaname IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename )
SELECT command from temp
LOOP
EXECUTE stmt;
END LOOP;
END;
$$;
시퀀스
DO
LANGUAGE plpgsql
$$
DECLARE
stmt text;
BEGIN
FOR stmt IN
WITH temp as (
SELECT 'ALTER SEQUENCE '|| sequence_schema || '."' || sequence_name ||'" OWNER TO newuser;' as command
FROM information_schema.sequences WHERE NOT sequence_schema IN ('pg_catalog', 'information_schema')
ORDER BY sequence_schema, sequence_name)
select command from temp
LOOP
EXECUTE stmt;
END LOOP;
END;
$$;
보기
DO
LANGUAGE plpgsql
$$
DECLARE
stmt text;
BEGIN
FOR stmt IN
WITH temp as (
SELECT 'ALTER VIEW '|| table_schema || '."' || table_name ||'" OWNER TO newuser;' as command
FROM information_schema.views WHERE NOT table_schema IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name)
select command from temp
LOOP
EXECUTE stmt;
END LOOP;
END;
$$;
스키마
DO
LANGUAGE plpgsql
$$
DECLARE
stmt text;
BEGIN
FOR stmt IN
WITH schema_names as(
SELECT distinct(schemaname) FROM pg_tables WHERE NOT schemaname IN ('pg_catalog', 'information_schema')
ORDER BY schemaname)
SELECT 'ALTER SCHEMA '|| schemaname ||' OWNER TO newuser;' as command
FROM schema_names
LOOP
EXECUTE stmt;
END LOOP;
END;
$$;
구성원 자격을 변경해야 할 수 있는 데이터베이스의 기능 및 기타 구성요소도 기록합니다.
기능 및 트리거 기능
DO
LANGUAGE plpgsql
$$
DECLARE
stmt text;
BEGIN
FOR stmt IN
WITH temp as(
SELECT 'alter function '||nsp.nspname||'.'||p.proname||'('||pg_get_function_identity_arguments(p.oid)||') owner to newuser;' as command
FROM pg_proc p
JOIN pg_namespace nsp ON p.pronamespace = nsp.oid
WHERE NOT nsp.nspname IN ('pg_catalog', 'information_schema'))
SELECT command FROM temp
LOOP
EXECUTE stmt;
END LOOP;
END;
$$;
테이블, 뷰 및 시퀀스의 소유권을 변경해야 했고 @rjk가 게시한 훌륭한 솔루션이 다음과 같은 세부 사항에도 불구하고 잘 작동하고 있다는 것을 알게 되었습니다.개체 이름이 대소문자가 혼합된 경우(예: "TableName") "Not found" 오류와 함께 실패합니다.
를 피하기 는 개체 : 문 제 를 해 로 결 이 개 름 묶 을 니 습 다 체 이 같 이 다 과 음 하 면 려 ▁" 로 다 니 ▁' ▁the 묶 ▁to ▁with ▁like ▁this ▁names ▁' : ▁wrap습 ▁"
테이블
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;
Postgre에서 다음을 시도할 수 있습니다.SQL 9
DO $$DECLARE r record;
BEGIN
FOR r IN SELECT tablename FROM pg_tables WHERE schemaname = 'public'
LOOP
EXECUTE 'alter table '|| r.tablename ||' owner to newowner;';
END LOOP;
END$$;
Postgre에는 이러한 명령이 없습니다.SQL. 하지만 제가 얼마 전에 GRANTs에 대해 설명한 방법을 사용하여 해결할 수 있습니다.
pg_dump as insert statements
pg_dump -d -O database filename
-d ( data as inserts ) -O ( capital O is no owner )
그런 다음 백업 파일을 Postgre에 다시 연결합니다.SQL 사용:
psql -d database -U username -h hostname < filename
소유자가 포함되어 있지 않으므로 작성된 모든 테이블, 스키마 등은 지정한 로그인 사용자 아래에 작성됩니다.
저는 이것이 Postgre 간의 마이그레이션을 위한 좋은 접근법이 될 수 있다는 것을 읽었습니다.SQL 버전도 마찬가지입니다.
Elysch의 답변을 기반으로 여러 스키마에 대한 솔루션은 다음과 같습니다.
DO $$
DECLARE
r record;
i int;
v_schema text[] := '{public,schema1,schema2,schema3}';
v_new_owner varchar := 'my_new_owner';
BEGIN
FOR r IN
select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.tables where table_schema = ANY (v_schema)
union all
select 'ALTER TABLE "' || sequence_schema || '"."' || sequence_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.sequences where sequence_schema = ANY (v_schema)
union all
select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.views where table_schema = ANY (v_schema)
union all
select 'ALTER FUNCTION "'||nsp.nspname||'"."'||p.proname||'"('||pg_get_function_identity_arguments(p.oid)||') OWNER TO ' || v_new_owner || ';' as a from pg_proc p join pg_namespace nsp ON p.pronamespace = nsp.oid where nsp.nspname = ANY (v_schema)
union all
select 'ALTER DATABASE "' || current_database() || '" OWNER TO ' || v_new_owner
LOOP
EXECUTE r.a;
END LOOP;
FOR i IN array_lower(v_schema,1) .. array_upper(v_schema,1)
LOOP
EXECUTE 'ALTER SCHEMA "' || v_schema[i] || '" OWNER TO ' || v_new_owner ;
END LOOP;
END
$$;
@Alex Soto의 답변은 올바른 것이며 @Yoav Aner가 업로드한 요지도 테이블/뷰 이름에 특수 문자가 없으면 작동합니다(포스트에서 합법적임).
당신은 그들을 탈출시켜야 직장에 갈 수 있고 저는 그것에 대한 요지를 업로드했습니다: https://gist.github.com/2911117
pg_change_db_owner.sh라는 편리한 스크립트를 만들었습니다.이 스크립트는 데이터베이스 스키마의 모든 테이블, 보기, 시퀀스 및 함수에 대한 소유권과 스키마 자체의 소유자를 변경합니다.
특정 데이터베이스 역할이 소유한 특정 데이터베이스의 모든 개체 소유권을 변경하려면 명령을 사용하면 됩니다.REASSIGN OWNED대신.
Postgre에서 시작SQL 9.0은 다음과 같은 기능을 제공합니다.GRANT [priv name] ON ALL [object type] IN SCHEMA어디에[priv name]가 대표적입니다.SELECT, INSERT, UPDATE, DELETE, etc그리고.[object type]다음 중 하나일 수 있습니다.
TABLESSEQUENCESFUNCTIONS
PostgreSQL의 문서를 게시하고 이와 관련하여 더 자세히 설명합니다.일부 상황에서는 여전히 시스템 카탈로그와 관련된 트릭을 사용해야 합니다.pg_catalog.pg_*) 하지만 그것은 거의 흔하지 않습니다.다음 작업을 자주 수행합니다.
BEGIN특권을 변경하기 위한 거래- 소유권 변경
DATABASES"DBA 역할"로 - 소유권 변경
SCHEMAS"DBA 역할"로 REVOKE ALL모든 사람의 특권TABLES,SEQUENCES그리고.FUNCTIONS모든 역할에서GRANT SELECT, INSERT, UPDATE, DELETE적절한 역할에 적합한 표에 표시COMMITDCL 거래
승인된 솔루션은 기능 소유권을 고려하지 않습니다. 솔루션이 모든 것을 처리합니다(검토하는 동안 위의 @magiconair와 유사함을 알게 되었습니다).
echo "Database: ${DB_NAME}"
echo "Schema: ${SCHEMA}"
echo "User: ${NEW_OWNER}"
pg_dump -s -c -U postgres ${DB_NAME} | egrep "${SCHEMA}\..*OWNER TO"| sed -e "s/OWNER TO.*;$/OWNER TO ${NEW_OWNER};/" | psql -U postgres -d ${DB_NAME}
# do following as last step to allow recovery
psql -U postgres -d postgres -c "ALTER DATABASE ${DB_NAME} OWNER TO ${NEW_OWNER};"
다음과 같은 간단한 셸 스크립트가 저에게 효과가 있었습니다.
#!/bin/bash
for i in `psql -U $1 -qt -c "select tablename from pg_tables where schemaname='$2'"`
do
psql -U $1 -c "alter table $2.$i set schema $3"
done
여기서 $1 - 사용자 이름(사용자 이름) $2 = 기존 스키마 $3 = 새 스키마에 입력합니다.
기능에 대한 @AlexSoto의 접근 방식과 동일합니다.
IFS=$'\n'
for fnc in `psql -qAt -c "SELECT '\"' || p.proname||'\"' || '(' || pg_catalog.pg_get_function_identity_arguments(p.oid) || ')' FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid WHERE n.nspname = 'public';" YOUR_DB` ; do psql -c "alter function $fnc owner to NEW_OWNER" YOUR_DB; done
테이블의 경우 다음을 반복해야 합니다.
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" YOUR_DB` ; do psql -U postgres -c "alter table \"$tbl\" owner to NEW_USER" YOUR_DB ; done
도커: 모든 테이블 + 시퀀스의 소유자 수정
export user="your_new_owner"
export dbname="your_db_name"
cat <<EOF | docker run -i --rm --link postgres:postgres postgres sh -c "psql -h \$POSTGRES_PORT_5432_TCP_ADDR -p \$POSTGRES_PORT_5432_TCP_PORT -U postgres -d $dbname" | grep ALTER | docker run -i --rm --link postgres:postgres postgres sh -c "psql -h \$POSTGRES_PORT_5432_TCP_ADDR -p \$POSTGRES_PORT_5432_TCP_PORT -U postgres -d $dbname"
SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' OWNER TO $user;' FROM pg_tables WHERE schemaname = 'public';
SELECT 'ALTER SEQUENCE '||relname||' OWNER TO $user;' FROM pg_class WHERE relkind = 'S';
EOF
우체국이 소유한 테이블을 바꾸고 싶어서 소유권을 다시 할당하는 것은 저에게 효과가 없었습니다.
저는 Alex의 방법을 사용하게 되었지만, psql 내에서 이 방법을 사용하고 싶었습니다.저는 다음과 같은 것으로 충분했습니다.
DO $$
DECLARE
rec record;
BEGIN
FOR rec in
SELECT *
FROM pg_tables
where schemaname = 'public'
LOOP
EXECUTE 'alter table ' || quote_ident(rec.tablename) || ' owner to new_owner';
END LOOP;
END
$$;
다른 토론들을 보면, 그것은 저 자신의 문제에 맞지 않습니다.말씀하신 것처럼, 소유자가 우체국이면 REASCHE OWNED는 작동하지 않습니다.그래서, 저는 이전의 토론에서 영감을 받아 이 대본을 썼습니다.
CREATE OR REPLACE FUNCTION public.alt_own_onall (v_new_owner text)
RETURNS void
LANGUAGE plpgsql
AS $alt_own_onall$
-- ALTer OWNer ON ALL objects
DECLARE
r RECORD;
v_sqlcmd TEXT; -- commande SQL
b_modif BOOLEAN DEFAULT false; -- si au moins une modif
BEGIN
v_new_owner := quote_ident (v_new_owner);
IF v_new_owner NOT IN
(SELECT role_name FROM information_schema.enabled_roles WHERE role_name <>'postgres')
THEN
RAISE WARNING '[%] est inconnu', v_new_owner;
RETURN;
END IF
; -- tables
RAISE INFO 'Le nouveau propriétaire des tables, vues, fonctions, schémas et de la base va être [%]', v_new_owner
;
FOR r IN
SELECT quote_ident(schemaname) || '.' || quote_ident(tablename) sch_tbl
FROM pg_catalog.pg_tables
WHERE schemaname !~'^(pg_|information)' AND tableowner <> v_new_owner
LOOP
v_sqlcmd := 'ALTER TABLE ' || r.sch_tbl || ' OWNER TO ' || v_new_owner || ';';
RAISE INFO 'Exécution de [%]', v_sqlcmd;
EXECUTE v_sqlcmd;
b_modif := true;
END LOOP
; -- views
FOR r IN
SELECT quote_ident(schemaname) || '.' || quote_ident(viewname) v_sch_nam
FROM pg_catalog.pg_views
WHERE schemaname !~'^(pg_|information)' AND viewowner <> v_new_owner
LOOP
v_sqlcmd := 'ALTER VIEW '|| r.v_sch_nam ||' OWNER TO ' || v_new_owner || ';';
RAISE INFO 'Exécution de [%]', v_sqlcmd;
EXECUTE v_sqlcmd;
b_modif := true;
END LOOP
; -- séquences
/*
ERROR: cannot change owner of sequence "*_seq"
DETAIL: Sequence "*_seq" is linked to table "*".
FOR r IN
SELECT quote_ident(sequence_schema) || '.' || quote_ident(sequence_name) s_sch_nam
FROM information_schema.sequences
WHERE sequence_schema !~'^(pg_|information)'
LOOP
EXECUTE 'ALTER SEQUENCE ' || r.s_sch_nam || ' OWNER TO ' || v_new_owner || ';'
;
END LOOP
; -- fonctions */
FOR r IN
SELECT
quote_ident (n.nspname) || '.' || quote_ident (p.proname) || '(' ||
pg_get_function_identity_arguments (p.oid) || ')' AS nsp_pro_arg
FROM pg_proc AS p
JOIN pg_namespace AS n ON p.pronamespace = n.oid
JOIN pg_authid AS a ON p.proowner = a.oid
WHERE n.nspname !~'^(pg_|information)' AND quote_ident(a.rolname) <> v_new_owner
LOOP
v_sqlcmd := 'ALTER FUNCTION ' || r.nsp_pro_arg || ' OWNER TO ' || v_new_owner || ';';
RAISE INFO 'Exécution de [%]', v_sqlcmd;
EXECUTE v_sqlcmd;
b_modif := true;
END LOOP
; -- schémas
FOR r IN
SELECT quote_ident(schema_name) s_nam
FROM information_schema.schemata
WHERE schema_name !~'^(pg_|information)' AND quote_ident(schema_owner) <> v_new_owner
LOOP
v_sqlcmd := 'ALTER SCHEMA ' || r.s_nam || ' OWNER TO ' || v_new_owner || ';';
RAISE INFO 'Exécution de [%]', v_sqlcmd;
EXECUTE v_sqlcmd;
b_modif := true;
END LOOP
; -- base
FOR r IN
SELECT d.datname, a.rolname
FROM pg_database d JOIN pg_authid a ON d.datdba=a.oid
WHERE d.datname=current_database() AND a.rolname <> v_new_owner
LOOP
v_sqlcmd := 'ALTER DATABASE ' || quote_ident(current_database()) || ' OWNER TO ' || v_new_owner || ';';
RAISE INFO 'Exécution de [%]', v_sqlcmd;
EXECUTE v_sqlcmd;
b_modif := true;
END LOOP
;
IF NOT b_modif THEN RAISE INFO 'Aucune modification n''a été effectuée.'; END IF;
END
;$alt_own_onall$;
psql에서 사용하려면 : sELECT alt_own_onall('new_role_name');당신은 프랑스어에서 당신의 언어로 메시지를 번역해야 합니다.9.5페이지에서 작동
이것은 책임감을 가지고 매우 쉽습니다.건너뛸 수도 있습니다.obj_type개체 유형의 소유권을 수정합니다.
- name: Reassigner owner of all objects
postgresql_owner:
login_user: "{{ postgres_admin_username }}"
login_unix_socket: "{{postgres_socket}}"
db: "db-name"
new_owner: "new-owner"
reassign_owned_by: "old-owner"
obj_type: "table"
다음은 몇 가지 추가 정보가 포함된 설명서입니다. https://docs.ansible.com/ansible/latest/collections/community/general/postgresql_owner_module.html
도움이 되길 바랍니다.
다음은 소유자를 변경하는 것이 아니라 역할을 변경하지만, 제가 해야 할 일이었습니다. 그리고 구글을 검색할 때 저는 이 퀘스트에 도달했습니다. 따라서 완전성을 위해 여기에 입력하겠습니다.
위의 솔루션 중 어떤 것도 작동하지 않았기 때문에, 저는 계속해서 다음과 같은 이점을 얻었습니다.must be owner of relation xxx최종 솔루션은 다음과 같습니다.
GRANT olduser TO newuser;
언급URL : https://stackoverflow.com/questions/1348126/postgresql-modify-owner-on-all-tables-simultaneously-in-postgresql
'programing' 카테고리의 다른 글
| 제약 조건을 일시적으로 해제합니다(MS SQL). (0) | 2023.05.20 |
|---|---|
| "gitrm -r"을 되돌리는 방법? (0) | 2023.05.20 |
| Postgresql 데이터베이스에서 null을 허용하지 않는 열을 추가하려면 어떻게 해야 합니까? (0) | 2023.05.05 |
| 작업 공간을 구축할 때 일식이 고착됨 (0) | 2023.05.05 |
| unix diff 좌우 결과? (0) | 2023.05.05 |