错误:必须是语言plpgsql的所有者

时间:2010-12-06 16:44:53

标签: ruby-on-rails ruby postgresql activerecord 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忽略)。< / p>

我希望有人可以对此有所了解吗?

注意:我已使用pg 0.9.0适配器gem和版本postgres的{​​{1}} gem - 两者都显示相同的行为。

我的队友运行0.7.9.2008.01.28语言安装是手动步骤。

5 个答案:

答案 0 :(得分: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

了解详情

答案 1 :(得分:20)

对于新读者,我在我自己的一个项目中遇到此错误后阅读了这篇旧文章。我强烈认为给应用程序的PostgreSQL一个超级用户角色是一个可怕的想法,改变模板也不理想。由于Rails应用程序的数据库不需要由db:structure:dump添加引用的PSQL命令,因此我编写了一个自定义rake任务,用于注释structure.sql中有问题的行。我在https://gist.github.com/rietta/7898366上已经在Github上公开分享了该代码作为一个要点。

答案 2 :(得分:8)

解决方案如下:

在我的安装中,有标准模板template0template1 - 至少据我所知,postgres会在创建新数据库时查找编号最大的templateN,除非模板已指定。

在这种情况下,由于template0包含plpgsqltemplate1也是如此......我们的想法是,您将自定义template1以满足您的网站特定的默认需求,并且如果你搞砸了一切,你可以从template1恢复template0

由于我的网站特定要求是在我的Web应用程序的自动构建中安装plpgsql(我们必须保持这一步骤以保持8.4兼容性) - 解决方案很简单:删除plpgsql来自template1并且警告/错误消失了。

如果特定于站点的默认值会发生变化,我们应该回到默认行为,我们只需删除template1并重新创建它(使用template0)< / p>

答案 3 :(得分:2)

我在尝试RAILS_ENV=development bundle exec rake db:reset时遇到此错误。我可以通过RAILS_ENV=development bundle exec rake db:drop db:create db:migrate来完成同样的事情(出于我的目的)。

答案 4 :(得分:0)

我只是在结构转储后的structure.sql文件中过滤plpgsql扩展语句:

# 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