PostgreSQL Cambiar el propietario de todas las tablas bajo un esquema específico

19

Estoy tratando de cambiar el propietario de todas las tablas bajo el mismo esquema en una línea de comando. es decir: alter table schema_name.* owner to newowner. ¿Hay alguna manera de lograr eso?

Destino retorcido
fuente

Respuestas:

11

Reasignado Propiedad

Hay un comando de privilegio específico que hace exactamente esto RESASSIGN OWNED,. Esto reasigna todos los objetos, no solo los de un esquema específico.

Esquema específico

Puede generar los ALTER TABLEcomandos con lo siguiente,

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

En psql, puede ejecutarlos siguiéndolo inmediatamente con \gexec

Evan Carroll
fuente
8

No conozco ninguna forma de lograr esto simplemente a través de psql, pero usando bash, puede enumerar las tablas en la base de datos $ DB con:

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

Y la propiedad se puede transferir a $ OWNER con:

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

Encadenar esto juntos te da:

 $ 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 y $ OWNER representan la base de datos, el esquema (generalmente 'público') y el nombre del nuevo propietario, respectivamente.

jrial
fuente
7

Si puede consultar los nombres de tabla en su esquema, puede generar las consultas para ALTERAR la propiedad de la tabla.

Por ejemplo:

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

devolverá la consulta para cambiar la propiedad de todas las tablas:

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

entonces puedes ejecutar estos :)

Ali Saeed
fuente
1

Este script hará el truco.

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

encontrado aquí https://github.com/trrao/PostgreSQL_Scripts

yatabani
fuente
0

Similar a lo anterior usando bash pero tuve que generar un archivo de texto y luego ingresarlo en 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

Basado en esto, pero se agregó la base de datos: http://penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html

riley
fuente
0

Esta es una función que uso para cambiar la propiedad de tabla, vista y función en un esquema. Es rápido, limpio y un buen ejemplo de cómo usar cursores también. Además, no se requiere línea de comando.

Lo siguiente cambiará los permisos a través de una función 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
fuente