【问题标题】:OCI8 + Activerecord, How to create triggerOCI8 + Activerecord,如何创建触发器
【发布时间】:2015-09-02 01:58:08
【问题描述】:

我一直在处理这个问题。 我正在使用活动记录 + OCI8 + Sinatra,但我无法运行迁移(因为我无法访问数据库上的管理员用户,但我可以向我的 oracle 管理员发送查询)。

这是我的模特

class Modify < ActiveRecord::Base
  self.sequence_name = "PRM_W01.seq_modifies"
  belongs_to :parameter
end

但是当我尝试创建一个新用户时,我得到了这个输出

D, [2015-08-31T16:50:34.636767 #4696] DEBUG -- :   Primary Key (7.5ms)  SELECT cc.column_name FROM all_constraints c, all_cons_columns cc WHERE c.owner = 'PRM_W01' AND c.table_name = 'MODIFIES' AND c.constraint_type = 'P' AND cc.owner = c.owner AND cc.constraint_name = c.constraint_name
D, [2015-08-31T16:50:34.639891 #4696] DEBUG -- :   Primary Key Trigger (2.5ms)            SELECT trigger_name
          FROM all_triggers
          WHERE owner = 'PRM_W01'
            AND trigger_name = 'MODIFIES_PKT'
            AND table_owner = 'PRM_W01'
            AND table_name = 'MODIFIES'
            AND status = 'ENABLED'

OCIError: ORA-00942: table or view does not exist

我正在阅读this

创建主键触发器(这样你就可以跳过主键值 插入语句)。默认情况下,触发器名称为“table_name_pkt”, 您可以使用 :trigger_name 选项覆盖名称(但它不是 建议覆盖它,因为这样就不会检测到此触发器 通过 ActiveRecord 模型,它仍然会预取序列 值)。

所以我认为我的问题是我没有创建该触发器,但我不知道如何迁移,有人可以帮我获取该代码吗?

【问题讨论】:

    标签: ruby sinatra rails-activerecord oci8 sinatra-activerecord


    【解决方案1】:

    我已经解决了这个在 db 上创建这个触发器的问题。

    CREATE OR REPLACE TRIGGER  PRM_W01.MODIFIES_PKT
    BEFORE INSERT ON PRM_W01.MODIFIES FOR EACH ROW
    BEGIN
    IF inserting THEN
    IF :new.id IS NULL THEN
    SELECT PRM_W01.SEQ_MODIFIES.NEXTVAL INTO :new.id FROM dual;
    END IF;
    END IF;
    END;
    

    我从oracle-enhanced 读取代码来创建它。

    为了让预言机在我自己的开发人员环境中运行,我发现的另一件很酷的事情是this docker image

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2014-12-04
      • 2014-02-02
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多