ОШИБКА: должен быть владельцем языка 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
, где языковая установка - это ручной шаг.
Ответы
Ответ 1
Решение было следующим:
В моей установке есть стандартные шаблоны template0
и template1
- по крайней мере, поскольку я понимаю, что postgres будет искать наивысший номер templateN
при создании новой базы данных, если только не указан шаблон.
В этом случае в качестве template0
включен plpgsql
, так же как и template1
... идея заключается в том, что вы настроите template1
для набора ваших потребностей по умолчанию для вашего сайта, а в случае, если вы все взорвите, вы должны восстановить template1
из template0
.
Поскольку мое специфическое требование для сайта заключалось в установке plpgsql
как части автоматической сборки моего веб-приложения (шаг, который мы должны были поддерживать, чтобы поддерживать совместимость с 8.4) - решение было простым: удалите plpgsql
из template1
и предупреждение/ошибка исчезла.
В случае изменения значений по умолчанию для сайта, и нам нужно будет вернуться к поведению по умолчанию, мы просто удалим template1
и заново создадим его (что будет использовать template0
)
Ответ 2
У меня была та же проблема. Я исправил свой шаблон с помощью команд ниже
psql template1
template1=# alter role my_user_name with superuser;
читайте больше на http://gilesbowkett.blogspot.com/2011/07/error-must-be-owner-of-language-plpgsql.html
Ответ 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