【问题标题】:run sql scripts with fluentmigrator使用 fluentmigrator 运行 sql 脚本
【发布时间】:2013-01-18 07:27:15
【问题描述】:

我有 SQL 脚本:

CREATE TABLE TESTTABLE1(
   ID_TESTTABLE1          NUMBER (18) NOT NULL,
   TESTTABLE_VALUE1       NUMBER (18),
   TESTTABLE_KEY1       NUMBER (18))

并使用 Fluentmigrator:

[Migration(201302021800)]
public class Migration_201302021800 : AutoReversingMigration
{
    public override void Up()
    {
        var url = @"Update_1.0.0.5.sql";
        Execute.Script(url);
    }
}

它执行成功,如果我添加一些SQL:

CREATE TABLE TESTTABLE1
(
  ID_TESTTABLE1          NUMBER (18) NOT NULL,
  TESTTABLE_VALUE1       NUMBER (18),
  TESTTABLE_KEY1       NUMBER (18)
);
CREATE TABLE TESTTABLE
(
  ID_TESTTABLE          NUMBER (18) NOT NULL,
  TESTTABLE_VALUE      NUMBER (18),
  TESTTABLE_KEY      NUMBER (18)
);

在 Fluentmigrator 中执行失败,Oracle exeption {"ORA-00911: invalid character"}

我的数据库是 Oracle db。

有什么问题?

【问题讨论】:

  • 您是否尝试在 fluent-migrator 之外运行扩展 SQL?它将帮助您区分问题是流式迁移还是纯 SQL。
  • 当然可以。它在 oracle 中成功执行。但我认为问题在于需要执行单个 sql 命令(如果它从 c# 执行),而不是一次全部执行。但我认为这是一些一次性运行的解决方案。
  • 因为我想您已经检查了错误的潜在来源 (techonthenet.com/oracle/errors/ora00911.php)。我建议将 SQL 拆分为两个文件。它经常帮助我通过流利的迁移器。
  • 是的,没关系,但是在真正的 sql 脚本中,我有超过 10 个命令,所以如果我从文件中拆分出来,我将有 10 个文件,这可能不是好方法
  • 也许是解析他的想法,然后在 foreach 中运行。但它不是稳定的情况。你认为不可能运行整个 sql 脚本吗?

标签: c# .net oracle11g database-migration fluent-migrator


【解决方案1】:

要为 Oracle 一起批处理语句,您需要将其包含在 BEGIN...END 块中。在您在 cmets 中链接到的最后一个示例中,您在第二条语句之后和 END 关键字之前缺少一个分号。

BEGIN 
CREATE TABLE TESTTABLE1 
    ( 
      ID_TESTTABLE1          NUMBER (18) NOT NULL, 
      TESTTABLE_VALUE1       NUMBER (18), 
      TESTTABLE_KEY1       NUMBER (18) 
    ); 
CREATE TABLE TESTTABLE 
    ( 
      ID_TESTTABLE          NUMBER (18) NOT NULL, 
      TESTTABLE_VALUE      NUMBER (18), 
      TESTTABLE_KEY      NUMBER (18) 
    );
END;

虽然 FluentMigrator 在这种情况下可以提供更好的支持。例如,当 FluentMigrator 处理来自 Sql Server 的多语句脚本时,它会拆分脚本并执行每个语句 (https://github.com/schambers/fluentmigrator/blob/master/src/FluentMigrator.Runner/Processors/SqlServer/SqlServerProcessor.cs#L197-236)。所以我建议在https://github.com/schambers/fluentmigrator/issues

记录一个问题

【讨论】:

    【解决方案2】:

    现在我不仅使用 BEGIN 和 END 语句,还使用 ​​EXECUTE IMMEDIATE 进行 CREATE ALTER 和 DROP。对于 INSERT,我只使用 BEGIN 和 END。

    BEGIN 
    EXECUTE IMMEDIATE'CREATE TABLE TESTTABLE1 
    ( 
      ID_TESTTABLE1          NUMBER (18) NOT NULL, 
      TESTTABLE_VALUE1       NUMBER (18), 
      TESTTABLE_KEY1       NUMBER (18) 
    )'; 
    EXECUTE IMMEDIATE 'CREATE TABLE TESTTABLE 
    ( 
      ID_TESTTABLE          NUMBER (18) NOT NULL, 
      TESTTABLE_VALUE      NUMBER (18), 
      TESTTABLE_KEY      NUMBER (18) 
    )';
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2013-01-11
      • 2013-08-14
      相关资源
      最近更新 更多