【问题标题】:DB Trigger Compatible with Both Oracle and HSQLDB数据库触发器与 Oracle 和 HSQLDB 兼容
【发布时间】:2016-05-29 08:53:50
【问题描述】:

我正在编写使用 HSQLDB 的集成测试,而在生产中,应用程序使用 Oracle DB。在 Oracle 上,我有一个触发器,如果​​特定表的主键为空,则使用序列中的下一个值填充它。我需要这个触发器才能在 HSQLDB 中工作,但我似乎可以找到一种方法让脚本对两个数据库都有效;下面是 Oracle SQL Dev Studio 生成的触发器:

CREATE OR REPLACE TRIGGER "WFMEXTENSIONS"."WORK_TRG" 
BEFORE INSERT ON WORK 
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.WORK_ID IS NULL THEN
      SELECT WORK_SEQ.NEXTVAL INTO :NEW.WORK_ID FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;
/

HSQL DB 正在“Oracle 兼容模式”下运行,使用

SET DATABASE SQL SYNTAX ORA TRUE;

任何想法如何修改触发器以在两个数据库上工作?

【问题讨论】:

  • 为什么不在两个 DBMS 中使用标识列并完全摆脱触发器?
  • 在 oracle 中,标识列是在 v12 中添加的,我使用的是 v11(升级不在我的控制范围内)
  • 然后使用 HSQLDB 中的标识列并忘记那里的触发器。 “行为”将是相同的

标签: oracle syntax compatibility hsqldb database-trigger


【解决方案1】:

我在HSQL trigger syntax 上注意到的一件事是它们的行引用(旧的和新的)不像Oracle 那样以冒号为前缀。我无权访问 HSQL DB 来测试项目,比如它是否会接受“REFERENCING NEW AS :new”,但这无论如何都与 Oracle 不兼容,所以没有任何帮助。

同样,默认的顺序访问也似乎不同:

INSERT INTO childtable VALUES 4, CURRENT VALUE FOR mysequence

所以问题是 Oracle 兼容模式的兼容性如何。这是否意味着存储代码语法的兼容性?或者只是声明的兼容性? The guide does not give me optimism:

SQL 例程通常是可移植的,但需要进行一些更改。

不是“可能需要”。 “是必要的”。坦率地说,我认为您可能正在尝试一些不太可能以成功告终的事情。

【讨论】:

    【解决方案2】:

    在 HSQLDB 中看起来像这样

    CREATE TRIGGER "WFMEXTENSIONS"."WORK_TRG" 
    BEFORE INSERT ON WORK REFERENCING NEW ROW AS NEW
    FOR EACH ROW 
    BEGIN ATOMIC
      BEGIN ATOMIC
        IF NEW.WORK_ID IS NULL THEN
          SELECT WORK_SEQ.NEXTVAL INTO NEW.WORK_ID FROM DUAL;
        END IF;
      END;
    END
    

    存储过程语法与 Oracle 略有不同,但个别 SQL 语句可以使用受支持的 Oracle 语法,例如 NEXTVALDUAL

    【讨论】:

    • 我尝试运行此代码并返回以下错误CREATE TRIGGER WORK_TRG BEFORE INSERT ON WORK REFERENCING NEW ROW AS NEW FOR EACH ROW BEGIN ATOMIC BEGIN ATOMIC IF NEW.WORK_ID IS NULL THEN SELECT WORK_SEQ.NEXTVAL INTO NEW.WORK_ID FROM DUAL; unexpected end of statement: required: ; 有什么想法吗?
    • 这是你用来输入脚本的程序。它需要接受分号,并且在有分号时不终止阅读。
    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2018-10-15
    相关资源
    最近更新 更多