2010-12-06 48 views
22

estoy usando PostgreSQL v9.0.1 con Rails (y es deps) @v2.3.8, debido a la utilización de la capacidad de texto completo de postgres, tengo una tabla que se define como:ERROR: debe ser dueño del plpgsql lenguaje

 
CREATE TABLE affiliate_products (
    id integer NOT NULL, 
    name character varying(255), 
    model character varying(255), 
    description text, 
    price numeric(9,2), 
    created_at timestamp without time zone, 
    updated_at timestamp without time zone, 
    textsearch_vector tsvector, 
); 

Observe la última línea, esto asegura que el registro activo no puede procesarlo con el volcador de esquema estándar, así que tengo que establecer config.active_record.schema_format = :sql en ./config/environment.rb; y use rake db:test:clone_structure en lugar de rake db:test:clone.

Nada de esto es demasiado notable, sólo es inconveniente - sin embargo rake db:test:clone_structure falla con el error:

ERROR: must be owner of language plpgsql

Debido a la línea #16 en mi resultante ./db/development_schema.sql:

CREATE OR REPLACE PROCEDURAL LANGUAGE plpgsql;

Bajo PostgreSQL v9.0+ el idioma plpsql es instalado por el superusuario, al plantilla inicial, que luego está disponible para el esquema recién creado.

No puedo ejecutar pruebas en este proyecto sin resolver esto, e incluso editar manualmente ./db/development_schema.sql es inútil, ya que se regenera cada vez que ejecute rake db:test:clone_structure (e ignorado por rake db:test:clone).

Espero que alguien pueda arrojar algo de luz sobre esto?

Nota: he utilizado tanto la gema pg 0.9.0 adaptador y el postgres joya en la versión 0.7.9.2008.01.28 - Ambos muestran un comportamiento idéntico.

Mis compañeros de equipo ejecutan PostgreSQL v8.4 donde la instalación del idioma es un paso manual.

+1

He considerado que debería eliminar el lenguaje 'pl/pgsql', e instalarlo manualmente cada vez. –

Respuesta

8

La solución fue la siguiente:

En mi instalación, hay plantillas estándar template0 y template1 - al menos como yo lo entiendo Postgres buscar la templateN número más alto cuando se crea una nueva base de datos, a menos que la plantilla es especificado.

En este caso, como template0 incluido plpgsql, lo hicieron template1 ... con la idea de que va a personalizar template1 a la habitación sus necesidades por defecto específicos del lugar, y en el caso de que volar todo, que restauraría template1 de template0.

Como mi requisito específico sitio fue instalar plpgsql como parte de la construcción automática de mi aplicación web (un paso que teníamos que mantener para mantener 8.4 compatibilidad) - la solución era fácil: eliminar plpgsql de template1 y la advertencia/error se fue.

En el caso de que los valores por defecto específicos del sitio cambiarían, y debemos tenga que volver al comportamiento predeterminado, nos basta con quitar template1 y volver a crearla (que pueden utilizar template0)

+0

No toma la plantilla numerada más alta, toma 'template1' a menos que especifique algo más. –

+0

Gracias por la aclaración Peter, error de mi parte. En el caso de que elimine 'template1' ¿' template0' no sería el predeterminado? (apoyando así mi suposición) –

22

que tenía la misma problema.He modificado la plantilla con los siguientes comandos

psql template1 
template1=# alter role my_user_name with superuser; 

Ver más en http://gilesbowkett.blogspot.com/2011/07/error-must-be-owner-of-language-plpgsql.html

+2

Esto funciona para mí; pero, ¿qué significa 'alterar el rol de mi_nombre_de_usuario con superusuario;' en realidad? –

+0

Hace su nombre de usuario_migo, SuperUser de postgres. –

+0

Esta no es una solución adecuada. No quiero otorgarle a este usuario derechos de superusuario. –

20

Para los nuevos lectores, he leído este post mayores después de haber funcionado en este error en una de mis propios proyectos. Creo firmemente que dar a la aplicación PostgreSQL un rol de superusuario es una idea terrible y cambiar la plantilla tampoco es ideal. Dado que los comandos PSQL referenciados que se agregan por db:structure:dump no son necesarios para la base de datos de la aplicación Rails, he escrito una tarea de rake personalizada que comenta las líneas problemáticas en structure.sql. He compartido ese código públicamente en Github como Gist al https://gist.github.com/rietta/7898366.

+1

Sus comentarios son acertados, y el archivo de rake proporcionado en el sitio funciona un melocotón - ¡Gracias! – Ivar

+0

Acepto, esta debería ser la respuesta preferida a esta pregunta. –

0

acabo de filtrar las declaraciones de extensión plpgsql desde el archivo de volcado posterior a structure.sql:

# lib/tasks/db.rake 

namespace :db do 
    desc "Fix 'ERROR: must be owner of extension plpgsql' complaints from Postgresql" 
    task :fix_psql_dump do |task| 
    filename = ENV['DB_STRUCTURE'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql") 
    sql = File.read(filename) 
    sql.sub!(/(CREATE EXTENSION IF NOT EXISTS plpgsql)/, '-- \1') 
    sql.sub!(/(COMMENT ON EXTENSION plpgsql)/, '-- \1') 
    File.open(filename, 'w') do |f| 
     f.write(sql) 
    end 
    task.reenable 
    end 
end 

Rake::Task["db:structure:dump"].enhance do 
    Rake::Task["db:fix_psql_dump"].invoke 
end 
1

me encontré con este error al intentar hacer RAILS_ENV=development bundle exec rake db:reset. Pude lograr lo mismo (para mis propósitos) al hacer RAILS_ENV=development bundle exec rake db:drop db:create db:migrate en su lugar.

Cuestiones relacionadas