PostgreSQL Cambia proprietario di tutte le tabelle in uno schema specifico


19

Sto cercando di cambiare il proprietario di tutte le tabelle con lo stesso schema in una riga di comando. Per esempio: alter table schema_name.* owner to newowner. C'è un modo per farlo?

Risposte:


11

Riassegnato di proprietà

C'è un comando di privilegio specifico che fa proprio questo RESASSIGN OWNED,. Questo riassegna tutti gli oggetti, non solo quelli in uno schema specifico.

Schema-specifica

È possibile generare i ALTER TABLEcomandi con il seguente,

SELECT format(
  'ALTER TABLE %I.%I.%I OWNER TO %I;',
  table_catalog,
  table_schema,
  table_name,
  current_user  -- or another just put it in quotes
)
FROM information_schema.tables
WHERE table_schema = 'mySchema';

In psql, puoi eseguirli seguendolo immediatamente con \gexec


8

Non conosco alcun modo per farlo puramente tramite psql, ma usando bash, puoi elencare le tabelle nel database $ DB con:

psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}

E la proprietà può essere trasferita a $ OWNER con:

psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}

Mettere insieme questo ti dà:

 $ for table in `psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}` ; do  psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB} ; done

$ DB, $ SCHEMA e $ OWNER rappresentano rispettivamente il database, lo schema (generalmente "pubblico") e il nome del nuovo proprietario.


7

Se è possibile eseguire query sui nomi di tabulazione nello schema, è possibile generare le query per la proprietà della tabella ALTER.

Per esempio:

 select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;' 
 from  pg_tables t
 where t.tableowner != 'rdsadmin';

restituirà la query per modificare la proprietà di tutte le tabelle:

ALTER TABLE schema_version OWNER TO ali;
ALTER TABLE users OWNER TO ali; 
ALTER TABLE company OWNER TO ali;
ALTER TABLE books OWNER TO ali;
...

allora puoi semplicemente eseguire questi :)




0

Questa è una funzione che utilizzo per modificare la proprietà di tabella, vista e funzione in uno schema. È veloce, pulito e un buon esempio di come usare anche i cursori. Inoltre, nessuna riga di comando richiesta.

Quanto segue cambierà le autorizzazioni attraverso una funzione plpgsql:

CREATE OR REPLACE FUNCTION YOURSCHEMA.do_changeowner(
    newowner text,
    pschem text)
  RETURNS void AS
$BODY$
declare
  tblnames CURSOR FOR
    SELECT tablename FROM pg_tables
    WHERE schemaname = pschem;
  viewnames CURSOR FOR
    SELECT viewname FROM pg_views
    WHERE schemaname = pschem;
  funcnames CURSOR FOR
    SELECT p.proname AS name, pg_catalog.pg_get_function_identity_arguments(p.oid) as params
    FROM pg_proc p 
    JOIN pg_namespace n ON n.oid = p.pronamespace 
    WHERE n.nspname = pschem;

begin

  FOR stmt IN tblnames LOOP
    EXECUTE 'alter TABLE ' || pschem || '.' || stmt.tablename || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN viewnames LOOP
    EXECUTE 'alter VIEW ' || pschem || '.' || stmt.viewname || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN funcnames LOOP
    EXECUTE 'alter FUNCTION ' || pschem || '.' || stmt.name || '(' ||  stmt.params || ') owner to ' || newowner || ';';
  END LOOP;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.