ОШИБКА: должен быть владельцем языка plpgsql - PullRequest
23 голосов
/ 06 декабря 2010

Я использую 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, где установка языка выполняется вручную.

Ответы [ 5 ]

22 голосов
/ 25 сентября 2011

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

psql template1
template1=# alter role my_user_name with superuser;

Подробнее на http://gilesbowkett.blogspot.com/2011/07/error-must-be-owner-of-language-plpgsql.html

21 голосов
/ 11 декабря 2013

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

8 голосов
/ 04 января 2011

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

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

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

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

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

2 голосов
/ 30 мая 2016

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

0 голосов
/ 18 сентября 2015

Я просто отфильтровал операторы расширения plpgsql из пост-дампа файла struct.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
...