【问题标题】:Oracle sequence not visible when created by ActiveRecord由 ActiveRecord 创建时 Oracle 序列不可见
【发布时间】:2017-02-03 19:22:42
【问题描述】:

我正在使用 ActiveRecord 迁移在 Oracle 数据库中创建表和序列,但我不能使用它创建的序列。

这是我尝试过的一个简单迁移:

class CreateFoo < ActiveRecord::Migration
   def self.up
     create_table "FOO" do |t|
       t.string   "name",     :limit => 50
       t.integer  "age"
     end
   end

   def self.down
     drop_table "FOO"
   end
end

但是,当我尝试在该表中插入记录时,它找不到序列。

SQL> insert into foo values(foo_seq.nextval, 'bob', 10);
insert into foo values(foo_seq.nextval, 'bob', 10)
                       *
ERROR at line 1:
ORA-02289: sequence does not exist

序列确实存在,但名称是大小写混合的。 Oracle 区分大小写吗?

SQL> select sequence_name from user_sequences;

SEQUENCE_NAME
------------------------------
FOO_seq

更改序列名称的大小写以匹配没有帮助。

SQL> insert into foo values(FOO_seq.nextval, 'bob', 10);
insert into foo values(FOO_seq.nextval, 'bob', 10)
                       *
ERROR at line 1:
ORA-02289: sequence does not exist

如何让 ActiveRecord 重新创建正常序列?这曾经对我有用,但这可能是在旧版本的 ActiveRecord 上。我现在使用的是 activerecord 4.0.13 和 activerecord-oracle_enhanced-adapter 1.5.6。

【问题讨论】:

    标签: ruby oracle activerecord


    【解决方案1】:

    问题

    经过一番研究,我发现如果在创建对象时使用quotes,Oracle 对象的名称可以区分大小写。

    1. 不带引号的标识符不区分大小写。 Oracle 将它们解释为大写。带引号的标识符区分大小写。

    所以如果我引用它的名字,我就可以使用这个序列。

    SQL> insert into foo values("FOO_seq".nextval, 'bob', 10);
    
    1 row created.
    

    好的,我了解 Oracle 在做什么,但为什么 ActiveRecord 在创建序列时使用引号?在深入研究了 activerecord-oracle_enhanced-adapter 源代码后,我找到了原因。要创建序列名称,它会将“_seq”附加到表名称。因为结果是大小写混合的,所以会添加引号。

    解决方案

    迁移时只需将表名切换为小写,则整个序列名将小写,并且不会被引用。这将使其不区分大小写。

    class CreateFoo < ActiveRecord::Migration
       def self.up
         create_table "foo" do |t|
           t.string   "name",     :limit => 50
           t.integer  "age"
         end
       end
    
       def self.down
         drop_table "foo"
       end
    end
    

    【讨论】:

      猜你喜欢
      • 2020-09-01
      • 1970-01-01
      • 2014-07-08
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多