2010-12-06 3 views
22

Я использую PostgreSQL v9.0.1 с Rails (и это DEPS) @v2.3.8, благодаря использованию полнотекстового способности Postgres, у меня есть таблица, которая определяется как:ОШИБКА: должен быть владельцем языка plpgsql

 
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, 
); 

Обратите внимание на последнюю строку, это гарантирует, что активная запись не сможет обработать ее со стандартным самозагрузчиком схемы, поэтому я должен установить config.active_record.schema_format = :sql в ./config/environment.rb; и использовать rake db:test:clone_structure вместо rake db:test:clone.

Все это не слишком замечательно, только неудобно - однако rake db:test:clone_structure завершается с ошибкой:

ERROR: must be owner of language plpgsql

Из-за линии #16 в моей результате ./db/development_schema.sql:

CREATE OR REPLACE PROCEDURAL LANGUAGE plpgsql;

Под PostgreSQL v9.0+ язык plpsql установлен суперпользователем, первоначальный шаблон, который затем доступен для вновь созданной схемы.

Я не могу запустить тесты по этому проекту без разрешения на это, и даже редактирование ./db/development_schema.sql вручную бесполезно, как он регенерируется каждый раз, когда я бегу rake db:test:clone_structure (и игнорируется rake db:test:clone).

Я надеюсь, что кто-то может пролить свет на это?

Примечание: я использовал как pg 0.9.0 адаптер драгоценный камень, и камень postgres в версии 0.7.9.2008.01.28 - как отображать идентичное поведение.

Мои товарищи по команде запускают PostgreSQL v8.4, где языковая установка представляет собой ручной шаг.

+1

Я считаю, что я должен отказаться от языка `pl/pgsql` и установить его вручную каждый раз. – 2010-12-06 19:56:58

ответ

8

Решение было следующим:

На моей установке есть стандартные шаблоны template0 и template1 - по крайней мере, как я понимаю, что Postgres будет искать с наибольшим номером templateN при создании новой базы данных, если шаблон не является указано.

В этом случае, как template0 включены plpgsql, так же template1 ... идея заключается в том, что вы будете настраивать template1 номера вашего сайта конкретных потребностей по умолчанию, и в том случае, если вы взорвать все, вы бы восстановить template1 от template0.

Как мой сайт конкретное требование было установить plpgsql как часть автоматизированной сборки моего веб-приложения (шаг мы должны были держать поддерживать 8.4 совместимость) - решение было легко: удалить plpgsql из template1 и предупреждения/ошибки ушел.

В случае, изменялось на конкретных участках по умолчанию, и мы должны должны вернуться к поведению по умолчанию, мы просто удалить template1 и воссоздать его (который будет использовать template0)

+0

Он не принимает шаблон с наивысшим номером, он принимает `template1`, если вы не указали что-то еще. – 2011-01-04 11:32:42

+0

Спасибо за разъяснение Питер, ошибка с моей стороны. В случае, если вы удалите `template1`,` template0` не будет использоваться по умолчанию? (тем самым поддерживая мое предположение) – 2011-01-04 13:46:42

22

У меня был тот же проблема.Я установил мой шаблон с командами ниже

psql template1 
template1=# alter role my_user_name with superuser; 

далее в http://gilesbowkett.blogspot.com/2011/07/error-must-be-owner-of-language-plpgsql.html

+2

Это работает для меня; но что «меняет роль my_user_name с суперпользователем», на самом деле? – 2012-08-06 07:15:38

20

Для новых читателей, я прочитал эту старую почту после впава в эту ошибку в одном из своих собственных проектов. Я сильно чувствую, что предоставление PostgreSQL приложения роли суперпользователя - ужасная идея, и изменение шаблона также не является идеальным. Поскольку ссылки на команды PSQL, добавленные db:structure:dump, не нужны в базе данных приложения Rails, я написал специальную задачу rake, которая учитывает проблемные строки в struct.sql. Я публиковал этот код в Github как Gist на https://gist.github.com/rietta/7898366.

0

Я просто фильтровать plpgsql заявления удлинительного из 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

Я столкнулся с этой ошибкой при попытке сделать RAILS_ENV=development bundle exec rake db:reset. Я смог выполнить то же самое (для моих целей), сделав вместо этого RAILS_ENV=development bundle exec rake db:drop db:create db:migrate.

Смежные вопросы