Vous n'êtes pas identifié(e).
Pages : 1
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
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.
Julien.
https://rjuju.github.io/
Hors ligne
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
Pour REASSIGN OWNED ça marche pas !
Quelle est l'erreur ?
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
Julien.
https://rjuju.github.io/
Hors ligne
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
Est-ce que postgres est le propriétaire de la base de données ?
Julien.
https://rjuju.github.io/
Hors ligne
oui
Hors ligne
Dans ce cas, il faut d'abord changer le propriétaire de la base, et ensuite traiter les tables problématiques restantes.
Julien.
https://rjuju.github.io/
Hors ligne
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
D'où le fait qu'il vous faut une procédure stockée pour le faire pour toutes les tables.
Guillaume.
Hors ligne
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
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
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
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
Julien.
https://rjuju.github.io/
Hors ligne
d'accord merci
Hors ligne
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
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
Pages : 1