Nota: Como @trygvis menciona en la respuesta a continuación , el REASSIGN OWNED
comando está disponible desde al menos la versión 8.2, y es un método mucho más fácil.
Como está cambiando la propiedad de todas las tablas, es probable que también desee vistas y secuencias. Esto es lo que hice:
Mesas:
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" YOUR_DB` ; do psql -c "alter table \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Secuencias:
for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" YOUR_DB` ; do psql -c "alter sequence \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Puntos de vista:
for tbl in `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" YOUR_DB` ; do psql -c "alter view \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Probablemente podría SECAR eso un poco ya que las declaraciones alter son idénticas para los tres.
REASSIGN OWNED BY old_role [, ...] TO new_role
Puedes usar el
REASSIGN OWNED
comando.Sinopsis:
Esto cambia todos los objetos que pertenecen
old_role
al nuevo rol. No tiene que pensar qué tipo de objetos tiene el usuario, todos se cambiarán. Tenga en cuenta que solo se aplica a objetos dentro de una única base de datos. Tampoco altera al propietario de la base de datos.Está disponible de nuevo al menos a 8.2. Su documentación en línea solo va tan atrás.
fuente
ERROR: unexpected classid 3079
. Supongo que actualmente no funciona si hay extensiones.Esto: http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.php también es una solución agradable y rápida, y funciona para múltiples esquemas en una base de datos:
Mesas
Secuencias
Puntos de vista
Vistas materializadas
Basado en esta respuesta
Esto genera todas las declaraciones /
ALTER TABLE
/ requeridas , cópielas y péguelas nuevamente en plsql para ejecutarlas.ALTER SEQUENCE
ALTER VIEW
Verifique su trabajo en psql haciendo:
fuente
Si desea hacerlo en una instrucción sql, debe definir una función exec () como se menciona en http://wiki.postgresql.org/wiki/Dynamic_DDL
Luego puede ejecutar esta consulta, cambiará el propietario de las tablas, secuencias y vistas:
$ NEWUSER es el nuevo nombre postgresql del nuevo propietario.
En la mayoría de los casos, debe ser un superusuario para ejecutar esto. Puede evitar eso cambiando el propietario de su propio usuario a un grupo de roles del que sea miembro.
Gracias a RhodiumToad en #postgresql por ayudar con esto.
fuente
Recientemente tuve que cambiar la propiedad de todos los objetos en una base de datos. Aunque las tablas, las vistas, los desencadenantes y las secuencias se cambiaron fácilmente, el enfoque anterior falló para las funciones, ya que la firma es parte del nombre de la función. Por supuesto, tengo experiencia en MySQL y no estoy tan familiarizado con Postgres.
Sin embargo, pg_dump le permite volcar solo el esquema y este contiene ALTER xxx OWNER TO yyy; declaraciones que necesitas. Aquí está mi poco de magia de concha sobre el tema
fuente
grep
comando. Soy nuevo en Linux, pero, según tengo entendido, parece quesed
está bien usarlo, especialmente porque de todos modos estás especificando una coincidencia entre mayúsculas y minúsculas.muy simple, pruébalo ...
fuente
es muy simple
hecho.
fuente
Me gusta este, ya que modifica las tablas , vistas , secuencias y funciones del propietario de un determinado esquema de una vez (en una instrucción sql), sin crear una función y puede usarlo directamente en PgAdmin III y psql :
(Probado en PostgreSql v9.2)
Basado en las respuestas proporcionadas por @rkj, @AlannaRose, @SharoonThomas, @ user3560574 y esta respuesta por @a_horse_with_no_name
Muchas gracias.
Mejor aún: también cambie la base de datos y el propietario del esquema .
fuente
information_schema.sequences
está vacío a pesar de queSELECT c.* FROM pg_class c WHERE c.relkind = 'S';
enumera secuencias. ¿Por qué podrían no coincidir?ALTER
consulta unALTER SEQUENCE
?Tuve que cambiar la propiedad de tablas, vistas y secuencias y descubrí que la excelente solución publicada por @rjk funciona bien, a pesar de un detalle: si los nombres de los objetos son de mayúsculas y minúsculas (por ejemplo, "TableName"), esto fallará con un " error no encontrado.
Para evitar esto, envuelva los nombres de los objetos con '"' así:
Mesas
Secuencias
Puntos de vista
fuente
Puede probar lo siguiente en PostgreSQL 9
fuente
No existe dicho comando en PostgreSQL. Pero puede solucionarlo utilizando el método que describí hace algún tiempo para GRANT.
fuente
Basado en la respuesta de elysch , aquí hay una solución para múltiples esquemas:
fuente
La respuesta de @Alex Soto es la correcta y la esencia cargada por @Yoav Aner también funciona siempre que no haya caracteres especiales en los nombres de tabla / vista (que son legales en postgres).
Necesitas escapar de ellos para trabajar y he subido una esencia para eso: https://gist.github.com/2911117
fuente
Luego canalice el archivo de copia de seguridad nuevamente a PostgreSQL usando:
Como no se incluye ningún propietario, todas las tablas, esquemas, etc. creados se crean con el usuario de inicio de sesión que especifique.
He leído que esto también podría ser un buen enfoque para migrar entre versiones de PostgreSQL.
fuente
He creado un script conveniente para eso; pg_change_db_owner.sh . Este script cambia la propiedad de todas las tablas, vistas, secuencias y funciones en un esquema de base de datos y también propietario del esquema en sí.
Tenga en cuenta que si solo desea cambiar la propiedad de todos los objetos, en una base de datos particular, propiedad de un rol de base de datos particular, simplemente puede usar el comando en su
REASSIGN OWNED
lugar.fuente
A partir de PostgreSQL 9.0, tiene la capacidad de
GRANT [priv name] ON ALL [object type] IN SCHEMA
dónde[priv name]
es lo típicoSELECT, INSERT, UPDATE, DELETE, etc
y[object type]
puede ser uno de:TABLES
SEQUENCES
FUNCTIONS
Los documentos de PostgreSQL se activan
GRANT
yREVOKE
entran en más detalles sobre esto. En algunas situaciones, todavía es necesario usar trucos que involucren los catálogos del sistema (pg_catalog.pg_*
), pero no es tan común. Con frecuencia hago lo siguiente:BEGIN
una transacción para modificar los privsDATABASES
a un "rol de DBA"SCHEMAS
"rol DBA"REVOKE ALL
Privs en todosTABLES
,SEQUENCES
yFUNCTIONS
de todos los rolesGRANT SELECT, INSERT, UPDATE, DELETE
en tablas relevantes / apropiadas para los roles apropiadosCOMMIT
La transacción DCL.fuente
La solución aceptada no se ocupa de la propiedad de la función. La siguiente solución se encarga de todo (mientras revisaba me di cuenta de que es similar a @magiconair arriba)
fuente
El siguiente script de shell más simple funcionó para mí.
Donde ingrese $ 1 - nombre de usuario (base de datos) $ 2 = esquema existente $ 3 = al nuevo esquema.
fuente
Igual que el enfoque de @ AlexSoto para las funciones:
fuente
Docker: Modificar propietario de todas las tablas + secuencias
fuente