PostgreSQL Changer le propriétaire de toutes les tables sous un schéma spécifique

19

J'essaye de changer le propriétaire de toutes les tables sous le même schéma dans une seule ligne de commande. à savoir: alter table schema_name.* owner to newowner. Y a-t-il un moyen d'y parvenir?

Destin tordu
la source

Réponses:

11

Propriétaire réaffecté

Il y a une commande de privilège spécifique qui fait exactement cela, RESASSIGN OWNED. Cela réattribue tous les objets, pas seulement ceux d'un schéma spécifique.

Spécifique au schéma

Vous pouvez générer les ALTER TABLEcommandes avec les éléments suivants,

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';

Dans psql, vous pouvez les exécuter en le suivant immédiatement avec \gexec

Evan Carroll
la source
8

Je ne connais aucun moyen d'accomplir cela uniquement via psql, mais en utilisant bash, vous pouvez lister les tables dans la base de données $ DB avec:

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

Et la propriété peut être transférée à $ OWNER avec:

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

En enchaînant cela, vous obtenez:

 $ 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 et $ OWNER représentent respectivement la base de données, le schéma (généralement «public») et le nom du nouveau propriétaire.

jrial
la source
7

Si vous pouvez interroger les noms de table dans votre schéma, vous pouvez générer les requêtes vers la propriété de table ALTER.

Par exemple:

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

renverra la requête pour changer la propriété de toutes les tables:

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;
...

alors vous pouvez simplement les exécuter :)

Ali Saeed
la source
1

Ce script fera l'affaire.

sh change_owner.sh -n new_owner -S schema_name

sh change_owner.sh -n user1 -S public

Summary:
    Tables/Sequences/Views : 16
    Functions              : 43
    Aggregates             : 1
    Type                   : 2

trouvé ici https://github.com/trrao/PostgreSQL_Scripts

yatabani
la source
0

Similaire à ci-dessus en utilisant bash mais j'ai dû sortir dans un fichier texte puis entrer dans psql:

$ psql -qAt -d mydatabase -c "SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' \
                                      OWNER TO new_owner;' \
                                      FROM pg_tables \
                                      WHERE schemaname = 'myschema'" > data.txt


$ psql < data.txt -d mydatabase

Basé sur cela, mais base de données ajoutée: http://penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html

riley
la source
0

Il s'agit d'une fonction que j'utilise pour changer la propriété de la table, de la vue et de la fonction dans un schéma. C'est rapide, propre et un bon exemple d'utilisation des curseurs. De plus, aucune ligne de commande n'est requise.

Les éléments suivants modifieront les autorisations via une fonction 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;
Martin Jstone
la source