Подтвердить что ты не робот

ОШИБКА: должен быть владельцем языка plpgsql

Я использую PostgreSQL v9.0.1 с Rails (и он deps) @v2.3.8, благодаря использованию полнотекстовой возможности postgres, у меня есть таблица, которая определяется как:

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, где языковая установка - это ручной шаг.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Я просто фильтрую выражения расширения plpgsql из файла struct.sql post-dump:

# 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