запускать скрипты sql с помощью fluentmigrator

У меня есть 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.

В чем проблема?


person AndreyMaybe    schedule 03.02.2013    source источник
comment
Вы пробовали запустить расширенный SQL вне fluent-migrator? Это поможет вам определить, в чем проблема заключается в свободном переносе или в чистом SQL.   -  person mipe34    schedule 03.02.2013
comment
Ну конечно; естественно. он успешно выполняется в оракуле. Но я думаю, что проблема в том, что нужно выполнять одну команду sql (если она выполняется из C #), а не все сразу. но я думаю, что это какое-то решение, которое запускается сразу.   -  person AndreyMaybe    schedule 03.02.2013
comment
Поскольку я полагаю, вы проверили потенциальный источник ошибки (techonthenet.com/oracle/errors /ora00911.php). Я бы предложил разделить SQL на два файла. Это часто помогает мне пройти беглый мигратор.   -  person mipe34    schedule 03.02.2013
comment
да, все в порядке, но на самом деле в sql-скрипте у меня более 10 команд, поэтому, если я разделю его из файлов, у меня будет 10 файлов, может быть, это не лучший способ   -  person AndreyMaybe    schedule 03.02.2013
comment
может быть, идея в этом разобрать его и запустить в foreach. но это не стабильный случай. вы думаете, что невозможно запустить весь sql скрипт?   -  person AndreyMaybe    schedule 03.02.2013
comment
Я все еще подозреваю, что произошла ошибка преобразования символов КОПИРОВАТЬ / ВСТАВИТЬ. Но.. ;-) . В моей миграции также есть один большой скрипт, создающий всю исходную БД, и он хорошо работал. Значит, это должно работать. Мое предложение было больше похоже на обходной путь (иногда это помогает мне держать волосы на голове). Однако есть ли причина, по которой вы не используете Fluent migrator API для создания таблиц?   -  person mipe34    schedule 03.02.2013
comment
Можете ли вы включить всю трассировку стека?   -  person Daniel Lee    schedule 03.02.2013
comment
возможно, ваш db - это ms sql .. ;-), но в случае, если я использую oracle), так что да, это хорошая идея, но у меня есть сценарий для включения файлов по умолчанию и т. д. поэтому, если я напишу использовать API-интерфейс Fluent migrator, это было бы очень громоздко.   -  person AndreyMaybe    schedule 03.02.2013
comment
Похоже на ту же проблему, что и у вас: groups.google.com/ d / topic / fluentmigrator-google-group / В нем говорится, что вы должны использовать BEGIN и END; вокруг ваших блоков.   -  person Daniel Lee    schedule 03.02.2013
comment
хорошо, я копирую трассировку стека: bit.ly/X6GZc5   -  person AndreyMaybe    schedule 03.02.2013
comment
Дэниел Ли, спасибо, он работает для Insert с BEGIN и END, но я не могу использовать его с CREATE DROP или ALETER, например bit.ly/X6Ijf6 не работает.   -  person AndreyMaybe    schedule 03.02.2013
comment
Я что-то упускаю? Как вы можете создать одну и ту же таблицу дважды (TESTTABLE)? Это не сработает ни с одной другой базой данных. Это работает на Oracle?   -  person Daniel Lee    schedule 03.02.2013
comment
См. Также здесь: stackoverflow.com/questions/685850/   -  person Daniel Lee    schedule 03.02.2013
comment
Не два начала и конца. BEGIN statement1; оператор2; КОНЕЦ;   -  person Daniel Lee    schedule 03.02.2013
comment
Извините, я вставил неправильный файл, это сработало bit.ly/X6Ijf6   -  person AndreyMaybe    schedule 03.02.2013
comment
Дэниел Ли, поэтому он работает только с этим утверждением (не похоже на то, что в bit.ly/X6Pu70) bit.ly/X6Ijf6, но помещать таблицу создания в строку не подходит   -  person AndreyMaybe    schedule 03.02.2013
comment
спасибо всем, так что это работает только с EXECUTE IMMEDIATE, есть другие идеи?   -  person AndreyMaybe    schedule 03.02.2013
comment
Извините, это похоже на проблему Oracle / ADO.Net. FluentMigrator мало что делает со скриптами, кроме их выполнения. Я подозреваю, что если вы попытаетесь выполнить это напрямую с помощью ADO.Net, вы получите ту же ошибку.   -  person Daniel Lee    schedule 03.02.2013
comment
Да вы правы, пробовала .. в любом случае спасибо. не могли бы вы просто написать ответ, чтобы другие разработчики могли это увидеть :) Заранее спасибо.   -  person AndreyMaybe    schedule 03.02.2013
comment
Глядя на то, как FluentMigrator справляется с этим для других баз данных, он разбивает сценарии с несколькими операторами, но не делает этого для Oracle. Поэтому, если вы не можете это исправить, вам следует зарегистрировать проблему на странице github.com/schambers/fluentmigrator/issues и, надеюсь, кто-нибудь (не я), кто что-то знает об Oracle, сможет это исправить.   -  person Daniel Lee    schedule 03.02.2013
comment
Дэниел Ли, извините, но не могли бы вы просто написать этот sql bit.ly/11E1U7A (он работает только), потому что ваш ответ содержит неработающий sql. заранее спасибо.   -  person AndreyMaybe    schedule 03.02.2013
comment
Дэниел Ли да конечно с удовольствием :) и готов немедленно помочь   -  person AndreyMaybe    schedule 03.02.2013
comment
Любопытство. Можете ли вы сказать мне, почему вы расширяете AutoReversingMigration вместо Migration в этой миграции?   -  person Dherik    schedule 23.09.2014


Ответы (2)


Чтобы объединить операторы Oracle в пакет, вам необходимо заключить их в блок BEGIN ... END. В вашем последнем примере, на который вы ссылались в комментариях, вам не хватает точки с запятой сразу после второго оператора и перед ключевым словом 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.

person Daniel Lee    schedule 03.02.2013

Теперь я использую не только инструкции 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;
person AndreyMaybe    schedule 03.02.2013