我正在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
语言安装是手动步骤。
答案 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)
解决方案如下:
在我的安装中,有标准模板template0
和template1
- 至少据我所知,postgres会在创建新数据库时查找编号最大的templateN
,除非模板已指定。
在这种情况下,由于template0
包含plpgsql
,template1
也是如此......我们的想法是,您将自定义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