PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 21/10/2015 11:09:01

Nabil
Membre

Modification propriétaire de toutes les tables

Comment modifier le propriétaire de toutes les tables créer par postgres dans un schema ??

owner:postgres ---> new_owner:user

Merci d'avance

Dernière modification par Nabil (21/10/2015 11:15:06)

Hors ligne

#2 21/10/2015 11:32:12

rjuju
Administrateur

Re : Modification propriétaire de toutes les tables

Vous avez le mot clé REASSIGN OWNED, mais ce n'est pas spécifique à un schéma : http://docs.postgresql.fr/9.4/sql-reassign-owned.html

Sinon, il faut utiliser une procédure stockée.

Hors ligne

#3 21/10/2015 11:39:51

Nabil
Membre

Re : Modification propriétaire de toutes les tables

Pour REASSIGN OWNED ça marche pas !
je vais essayer avec une PS, mais comment, par que j'ai essayé sa :

UPDATE pg_tables
SET tableowner = 'user'
WHERE  schemaname='sch_1' and tablename ='a'



mais sa marche pas

Hors ligne

#4 21/10/2015 11:54:42

rjuju
Administrateur

Re : Modification propriétaire de toutes les tables

Nabil a écrit :

Pour REASSIGN OWNED ça marche pas !

Quelle est l'erreur ?

Nabil a écrit :

je vais essayer avec une PS, mais comment, par que j'ai essayé sa :

UPDATE pg_tables
SET tableowner = 'user'
WHERE  schemaname='sch_1' and tablename ='a'

mais sa marche pas

Il faut utiliser un ALTER TABLE ... OWNER TO ..., voir la documentation : http://docs.postgresql.fr/9.4/sql-altertable.html

Hors ligne

#5 21/10/2015 11:56:17

Nabil
Membre

Re : Modification propriétaire de toutes les tables

ERROR:  cannot reassign ownership of objects owned by role postgres because they are required by the database system
********** Erreur **********

ERROR: cannot reassign ownership of objects owned by role postgres because they are required by the database system
État SQL :2BP01

Hors ligne

#6 21/10/2015 12:06:13

rjuju
Administrateur

Re : Modification propriétaire de toutes les tables

Est-ce que postgres est le propriétaire de la base de données ?

Hors ligne

#7 21/10/2015 12:07:31

Nabil
Membre

Re : Modification propriétaire de toutes les tables

oui

Hors ligne

#8 21/10/2015 12:29:49

rjuju
Administrateur

Re : Modification propriétaire de toutes les tables

Dans ce cas, il faut d'abord changer le propriétaire de la base, et ensuite traiter les tables problématiques restantes.

Hors ligne

#9 21/10/2015 12:37:51

Nabil
Membre

Re : Modification propriétaire de toutes les tables

Je peux changer le owner de la table à la main dans pgAdmin mêmes avec postgres comme owner de la base, le probléme est que j'ai 400 tables, donc c'est trop de changé manuellement le owner de ces tables.

Hors ligne

#10 21/10/2015 12:59:43

gleu
Administrateur

Re : Modification propriétaire de toutes les tables

D'où le fait qu'il vous faut une procédure stockée pour le faire pour toutes les tables.


Guillaume.

Hors ligne

#11 21/10/2015 13:46:41

Nabil
Membre

Re : Modification propriétaire de toutes les tables

merci, j'ai réglé mon probléme, il suffit just de récupérer le relowner de mon role et le relnamespace de mon schéma et faire :

update pg_class
set relowner = my_role
where relnamespace = my_schema

Hors ligne

#12 21/10/2015 14:23:23

gleu
Administrateur

Re : Modification propriétaire de toutes les tables

Vous êtes aventureux, c'est bien.

ALTER TABLE... OWNER... fait bien plus que ce simple UPDATE sur pg_class. Il y a plus de chances que vous ayez cassé quelque chose que réussi quelque chose. Bonne chance.


Guillaume.

Hors ligne

#13 21/10/2015 14:30:58

Nabil
Membre

Re : Modification propriétaire de toutes les tables

veuillez développer SVP !?

Oui un Alter fait l'affaire mais j'ai plus de 400 tables !!

Dernière modification par Nabil (21/10/2015 14:34:16)

Hors ligne

#14 21/10/2015 14:39:10

rjuju
Administrateur

Re : Modification propriétaire de toutes les tables

Il y a entre autre la vérification de l'appartenance d'une séquence ou d'un index à une table, pour lesquels les propriétaires ne doivent pas être différents, ou les conséquences que cela a sur les différents ACL des tables et colonnes.

Quel que soit le nombre de table, vous pouvez faire une procédure stockée qui va boucler sur toutes les tables et faire un ALTER TABLE qui va bien. Vous n'êtes même pas obligé de créer une procédure stockée, vous pouvez exécuter des blocs de code anonymes, cf http://docs.postgresql.fr/9.4/sql-do.html

Hors ligne

#15 21/10/2015 14:43:31

Nabil
Membre

Re : Modification propriétaire de toutes les tables

d'accord merci

Hors ligne

#16 21/10/2015 15:12:48

arthurr
Membre

Re : Modification propriétaire de toutes les tables

bonjour,

moi je fais ça :

select 'alter table ' || schemaname || '.' || relname || ' owner to NEW_USER;' from pg_stat_user_tables;

Ça génère le SQL, il ne reste plus qu'à l'executer

Hors ligne

#17 22/10/2015 10:08:20

Nabil
Membre

Re : Modification propriétaire de toutes les tables

Merci pour votre aide:
normalement j'ai réglé mon probléme avec :


---- Pour les tables ------------------------------------------------------------------------------------
DO $$DECLARE r record;
BEGIN
    FOR r IN SELECT schemaname, tablename
          FROM pg_tables WHERE NOT schemaname IN ('pg_catalog', 'information_schema')
    LOOP
        EXECUTE 'ALTER TABLE ' || quote_ident(r.schemaname) || '.' || quote_ident(r.tablename) || ' OWNER TO my_new_user;';
    END LOOP;
END;$$
---- Pour les sequences -------------------------------------------------------------------------------
DO $$DECLARE r record;
BEGIN
    FOR r IN SELECT sequence_schema, sequence_name
          FROM information_schema.sequences WHERE NOT sequence_schema IN ('pg_catalog', 'information_schema')
    LOOP
        EXECUTE 'ALTER SEQUENCE '|| quote_ident(r.sequence_schema) || '.' || quote_ident(r.sequence_name) ||' OWNER TO my_new_user;';
    END LOOP;
END;$$
--- Pour les vues ----------------------------------------------------------------------------------
DO $$DECLARE r record;
BEGIN
    FOR r IN SELECT table_schema, table_name
          FROM information_schema.views WHERE NOT table_schema IN ('pg_catalog', 'information_schema')
    LOOP
        EXECUTE 'ALTER VIEW '|| quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) ||' OWNER TO my_new_user;';
    END LOOP;
END;$$
--------------------------------------------------------------------------------------------------------

Hors ligne

Pied de page des forums