C'è un mezzo per impostare il proprietario di tutti gli oggetti in un database PostgreSQL, allo stesso tempo?

dba.stackexchange https://dba.stackexchange.com/questions/9708

Domanda

https://stackoverflow.com/questions/1348126/modify -proprietario-on-tutte-le tabelle-simultaneamente-in-postgresql descrive alcuni modi ingegnosi per tabella di modifica e altri oggetti per un utente specifico, e funziona a meraviglia, ma tutti i suggerimenti sembrano ignorare le funzioni che ho creato.

C'è un modo abbastanza facile per ripristinare il proprietario di tutti gli oggetti nel database, comprese le funzioni? Farlo a mano è altamente indesiderabile.

È stato utile?

Soluzione 5

Well, I didn't find a one-step process, but this takes care of all the objects I can see in my database:

update pg_class 
SET relowner = (SELECT oid FROM pg_roles WHERE rolname = 'foo')
where relnamespace = (select oid 
                      from pg_namespace 
                      where nspname = 'public' 
                      limit 1);

update pg_proc 
set proowner = (select oid from pg_roles where rolname = 'foo')
where pronamespace = (select oid 
                      from pg_namespace 
                      where nspname = 'public' 
                      limit 1);

Altri suggerimenti

Si deve sempre e solo manipolare cataloghi di sistema direttamente, se si sa esattamente cosa si sta facendo. Può avere effetti collaterali imprevisti. Oppure si può danneggiare il database (o l'intero cluster di database) in modo irreparabile.

di Jeremy risposta , mentre in pratica facendo il trucco, è non è consigliabile per la pubblico in generale. Cambia incondizionatamente tutte le funzioni in uno schema. Sei sicuro che non ci sono le funzioni del sistema colpiti o funzioni installate da un modulo aggiuntivo?
Sarebbe anche inutile cambiare il proprietario di funzioni che già appartengono al proprietario designato.

In primo luogo, verificare se REASSIGN OWNED potrebbe funzionare per voi:

cambiare la proprietà del database di oggetti di proprietà di un ruolo del database

Si deve elencare tutti i ruoli da sconosciuti in modo esplicito. Ma è riassegna anche funzioni .

Per assegnare tutte le funzioni (e non altri oggetti) in un determinato schema a un nuovo proprietario (opzionalmente indipendentemente dal proprietario precedente):

SELECT string_agg('ALTER FUNCTION ' || oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  n.nspname = 'public';
-- AND p.relowner <> (SELECT oid FROM pg_roles WHERE rolname = 'foo')
-- AND p.proname ~~ 'f_%'

Questo genera il canonica SQL comandi ALTER FUNCTION ... al cambiamento tutti funzioni (nello schema specificato). È possibile ispezionare i comandi prima di eseguirle - uno per volta o tutti in una volta:

ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...

I incluso alcune clausole WHERE commentate si potrebbe desiderare di utilizzare per filtrare i risultati.

Il cast di regprocedure produce un nome di funzione valida con i parametri, fare doppio citato, ove necessario, lo schema -. Qualificato, se necessario, per il search_path corrente

La funzione di aggregazione string_agg () richiede PostgreSQL 9.0 o dopo. Nella versione precedente sostituto con array_agg() e array_to_string().

potrebbero mettere tutto questo in una dichiarazione DO o una funzione come dimostrato in questa risposta relativa:

In Postgres 9.5 o successivo, è possibile semplificare la query utilizzando nuova tipi di identificatore di oggetto regnamespace e regrole :

SELECT string_agg('ALTER FUNCTION '|| oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM   pg_catalog.pg_proc
WHERE  pronamespace = 'public'::regnamespace;
-- AND relowner <> 'foo'::regrole
-- AND proname ~~ 'f_%'

Io uso questa funzione per modificare il proprietario di tabelle, funzioni, tipi, ecc È possibile modificare la query dei cursori per adattarlo alle proprie esigenze.

CREATE OR REPLACE FUNCTION fn_setowner(varchar(50), boolean) RETURNS void AS
$BODY$
DECLARE
p_owner ALIAS FOR $1;
p_debug ALIAS FOR $2;
v_i integer := 0;
v_sql text;

--  CURSORS
-- SCHEMA
pesquemas CURSOR FOR
    SELECT quote_ident(schema_name) as nombre_esquema from information_schema.schemata WHERE schema_name NOT LIKE 'pg_%'
    and schema_name NOT IN ('information_schema') ORDER BY 1 ASC;

-- TABLE
ptablas CURSOR FOR
    SELECT quote_ident(table_schema) || '.' || quote_ident(table_name) as nombre_tabla, * FROM information_schema.tables
    WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
    AND table_type <> 'FOREIGN TABLE' ORDER BY 1 ASC;

-- FUNCTION
pfunciones CURSOR FOR
    SELECT quote_ident(b.nspname) || '.' || quote_ident(a.proname) || '(' || pg_catalog.oidvectortypes(a.proargtypes) || ')' as nombre_function 
    FROM pg_proc a  INNER JOIN pg_namespace b on a.pronamespace = b.oid 
    WHERE b.nspname NOT IN ('pg_catalog', 'information_schema') AND proisagg = 'f'
    AND a.proname not like 'fsym_%' AND a.proname not like 'dblink%' ORDER BY 1 ASC;

-- SEQUENCE
psecuencias CURSOR FOR
    SELECT quote_ident(sequence_schema) || '.' || quote_ident(sequence_name) as nombre_secuencia FROM information_schema.sequences
    WHERE sequence_schema NOT IN ('pg_catalog', 'information_schema') ORDER BY 1 ASC;

-- TYPE
ptipos CURSOR FOR
    SELECT quote_ident(n.nspname) || '.' || quote_ident(t.typname) as nombre_tipo
    FROM pg_type t
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
    WHERE (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) 
    AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid)
    AND n.nspname NOT IN ('pg_catalog', 'information_schema') ORDER BY 1 ASC;


BEGIN
--  CHECK LOGIN
    IF NOT EXISTS (SELECT 1 FROM pg_user WHERE usename = p_owner) THEN                     
        RAISE EXCEPTION 'Login role not exists --> %', p_owner
            USING HINT = 'Please specify correct login and try again.';
    END IF;

    v_i = 0;
    if (p_debug) THEN
    RAISE NOTICE '--########## CHANGE SCHEMA OWNER ##########--';
    END IF;
    FOR resquema IN pesquemas LOOP
        v_sql = 'ALTER SCHEMA ' || resquema.nombre_esquema || ' OWNER TO ' || quote_ident(p_owner) || ';';
        if (p_debug) THEN RAISE NOTICE '%', v_sql; END IF;
        EXECUTE v_sql;
        v_i = v_i + 1;
    END LOOP;
    if (p_debug) THEN
    RAISE NOTICE '--@@@@@@ SCHEMAS WITH OWNER % TOTAL = % @@@@@@--', p_owner, CAST(v_i AS VARCHAR);
    END IF;

    v_i = 0;
    if (p_debug) THEN
    RAISE NOTICE '--########## CHANGE TABLE OWNER ##########--';
    END IF;
    FOR rtables IN  ptablas LOOP
        v_sql = 'ALTER TABLE ' || rtables.nombre_tabla || ' OWNER TO ' || quote_ident(p_owner) || ';';
        if (p_debug) THEN RAISE NOTICE '%', v_sql; END IF;
        EXECUTE v_sql;
        v_i = v_i + 1;
    END LOOP;
    if (p_debug) THEN
    RAISE NOTICE '--@@@@@@ TABLES WITH OWNER % TOTAL = % @@@@@@--', p_owner, CAST(v_i AS VARCHAR);
    END IF;

    v_i = 0;
    if (p_debug) THEN
    RAISE NOTICE '--########## CHANGE FUNCTION OWNER ##########--';
    END IF;
    FOR rfunction IN  pfunciones LOOP
        v_sql = 'ALTER FUNCTION ' || rfunction.nombre_function || ' OWNER TO ' || quote_ident(p_owner) || ';';
        if (p_debug) THEN RAISE NOTICE '%', v_sql; END IF;
        EXECUTE v_sql;
        v_i = v_i + 1;
    END LOOP;
    if (p_debug) THEN
    RAISE NOTICE '--@@@@@@ FUNCTIONS WITH OWNER % TOTAL = % @@@@@@--', p_owner, CAST(v_i AS VARCHAR);
    END IF;

    v_i = 0;
    if (p_debug) THEN
    RAISE NOTICE '--########## CHANGE SEQUENCE OWNER ########## --';
    END IF;
    FOR rsecuencias IN  psecuencias LOOP
        v_sql = 'ALTER TABLE ' || rsecuencias.nombre_secuencia || ' OWNER TO ' || quote_ident(p_owner) || ';';             
        if (p_debug) THEN RAISE NOTICE '%', v_sql; END IF;
        EXECUTE v_sql;
        v_i = v_i + 1;
    END LOOP;
    if (p_debug) THEN
    RAISE NOTICE '--@@@@@@ SEQUENCES WITH OWNER % TOTAL = % @@@@@@--', p_owner, CAST(v_i AS VARCHAR);
    END IF;

    v_i = 0;
    if (p_debug) THEN
    RAISE NOTICE '--########## CHANGE TYPE OWNER ##########--';
    END IF;
    FOR rtipos IN  ptipos LOOP                
        v_sql = 'ALTER TYPE ' || rtipos.nombre_tipo || ' OWNER TO ' || quote_ident(p_owner) || ';';                
        if (p_debug) THEN RAISE NOTICE '%', v_sql; END IF;
        EXECUTE v_sql;
        v_i = v_i + 1;
    END LOOP;
    if (p_debug) THEN
    RAISE NOTICE '--@@@@@@  TYPES WITH OWNER % TOTAL = % @@@@@@--', p_owner, CAST(v_i AS VARCHAR);
    END IF;

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Poi ho solo eseguire (se si desidera eseguire il debug di uscita è sufficiente impostare il secondo parametro su true):

SELECT fn_setowner('demo', false);
DROP FUNCTION fn_setowner(varchar(30), boolean);

Questo dovrebbe funzionare per le funzioni:

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

È possibile utilizzare il comando riassegnare PROPRIETA

Basta accedere al database con superutente ed eseguire seguente

REASSIGN OWNED BY [old_user] TO [new_user];

Questo cambia tutti gli oggetti tavoli cioè, la sequenza, la funzione ecc proprietà old_role al nuovo ruolo. Non dovete pensare a che tipo di oggetti che l'utente dispone, saranno tutti essere cambiati. Questo cambia gli oggetti solo se la u vuole cambiare la proprietà di quel database stesso basta usare ALTER DATABASE name OWNER TO new_owner

Questo è il metodo migliore come ci saranno n numero di tavoli, sequenza piuttosto andare per cicli e script bash

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top