4

我有许多 Oracle 触发器存储在我们使用 sqlplus 上传到数据库的文件中。我们想使用 liquibase 来管理它,但我真的不想将触发器拆分为单独的文件。该文件如下所示:

  create or replace trigger Trig1 ...
  ...
  end Trig1;
  /
  create or replace trigger Trig2 ...
  ...
  end Trig2;
  /
  ...etc.

我试过了

<sqlFile splitStatements="true" endDelimiter="/" path="triggers.sql">

但它似乎仍然试图分裂';'。如果我将 splitStatements 更改为 false。然后它会忽略“/”并将所有内容都包含为无效的单个触发器。有任何想法吗?

TIA。

4

4 回答 4

3

我最近遇到了这个问题。endDelimiter 应该是:

endDelimiter="(?m)^/$"
于 2014-08-22T10:46:15.340 回答
3

我意识到这是一个老问题,OP 已经继续前进,但对于其他任何人,我最终在这里找到了答案:http: //forum.liquibase.org/topic/oracle-end-delimiter-issue

原来“endDelimiter”是一个正则表达式——应该使用这个字符串:

\n/\s*\n|\n/\s*$
于 2013-06-06T02:16:53.717 回答
1

我对 Oracle 11g 和 Liquibase 也有类似的问题。我得到一个 ORA-00911。在我的 db-changelog.xml 中,我指向一个有触发器的 sql 文件。这根本不起作用。我已经用 /\; 测试了您上面所说的内容

CREATE OR REPLACE TRIGGER ADRESSE_ID_TR 
            BEFORE INSERT ON ADRESSE 
            FOR EACH ROW 
            WHEN (new.ID IS NULL) BEGIN 
            SELECT adresse_seq.NEXTVAL 
            INTO   :new.ID 
            FROM   dual; 
            END ADRESSE_ID_TR;\

我的解决方法是在 db-changelog.xml 中添加一个 in。我不喜欢它,因为 db-changelog.xml 会非常大,我希望它在 .sql 文件中而不是在 db-changelog.xml 中。

另一个问题是,当我使用 Oracle SQL Developer 之类的工具生成 DDL 并将它们粘贴进去时,它们不起作用。很多 sql 不起作用,可能不支持。我花了很多时间用 Eclipse 测试我的 SQL 和 Liquibase 来修复 SQL。任何提示或你会解决这个问题吗?

于 2011-12-15T13:35:14.403 回答
0

该语法看起来是正确的。endDelimiter 应该告诉它覆盖默认值;分隔符并使用 / 代替。您使用的是什么版本的 liquibase?如果您不单独放置 \ 会有帮助吗?

  create or replace trigger Trig1 ...
  ...
  end Trig1; /

  create or replace trigger Trig2 ...
  ...
  end Trig2; /

  ...etc.
于 2010-02-12T20:10:46.160 回答