programing

PostgreSQL: Postgre에서 모든 테이블의 OWNER 동시 수정SQL

showcode 2023. 5. 5. 10:04
반응형

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.

매우 간단합니다.

  1. su - postgres
  2. psql
  3. REASSIGN OWNED BY [old_user] TO [new_user];
  4. \c [your database]
  5. 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]다음 중 하나일 수 있습니다.

  • TABLES
  • SEQUENCES
  • FUNCTIONS

PostgreSQL의 문서를 게시하고 이와 관련하여 더 자세히 설명합니다.일부 상황에서는 여전히 시스템 카탈로그와 관련된 트릭을 사용해야 합니다.pg_catalog.pg_*) 하지만 그것은 거의 흔하지 않습니다.다음 작업을 자주 수행합니다.

  1. BEGIN특권을 변경하기 위한 거래
  2. 소유권 변경DATABASES"DBA 역할"로
  3. 소유권 변경SCHEMAS"DBA 역할"로
  4. REVOKE ALL모든 사람의 특권TABLES,SEQUENCES그리고.FUNCTIONS모든 역할에서
  5. GRANT SELECT, INSERT, UPDATE, DELETE적절한 역할에 적합한 표에 표시
  6. 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

반응형