2010-02-12 3 views
4

J'ai un certain nombre de déclencheurs Oracle stockés dans un fichier que nous téléchargeons sur notre DB en utilisant sqlplus. Nous voulons plutôt utiliser liquibase pour gérer cela, mais je ne veux pas vraiment séparer les déclencheurs dans des fichiers séparés. Le fichier ressemble à:Liquibase - chargement de nombreux déclencheurs Oracle dans un fichier

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

J'ai essayé

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

, mais il semble encore essayer de diviser le « ; ». Si je change splitStatements à false. il ignore ensuite le '/' et inclut tout comme un seul trigger invalide. Des idées?

TIA.

+0

Pourquoi ne voulez-vous pas diviser 'triggers.sql' en fichiers séparés? – APC

Répondre

0

Cette syntaxe semble correcte. EndDelimiter devrait lui indiquer de remplacer la valeur par défaut; délimiteur et use/à la place. Quelle version de la liquibase utilisez-vous? Cela aide-t-il si vous mettez le \ pas par lui-même?

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

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

    ...etc. 
+0

Avec '/' en tant que séparateur, il y a des problèmes avec les commentaires de style C (/*...*/), les dates (10/10/2011) et autres. Voir http://forum.liquibase.org/topic/oracle-end-delimiter-issue – fglez

1

J'ai un problème similaire avec Oracle 11g et Liquibase. Je reçois un ORA-00911. Dans mon fichier db-changelog.xml, je pointe vers un fichier sql où j'ai des triggers. Cela ne fonctionne pas du tout. J'ai testé les choses que vous avez dites ci-dessus avec/\;

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;\ 

Ma solution de contournement consiste à ajouter un fichier in db-changelog.xml. Je ne l'aime pas parce que le db-changelog.xml va être très grand et je le veux dans les fichiers .sql pas dans db-changelog.xml.

Un autre problème est lorsque je génère des DDL avec des outils comme Oracle SQL Developer et les collez, ils ne fonctionnent pas. Beaucoup de sql ne fonctionnent pas, probablement pas pris en charge. Je passe beaucoup de temps à tester mes SQL et Liquibase avec Eclipse pour corriger les SQL. Des conseils ou allez-vous résoudre ce problème?

3

Je me rends compte que c'est un vieux problème et OP est passé, mais pour quelqu'un d'autre j'ai fini par trouver la réponse ici: http://forum.liquibase.org/topic/oracle-end-delimiter-issue.

Il se trouve « endDelimiter » est une expression régulière - cette chaîne doit être utilisé:

\n/\s*\n|\n/\s*$ 
+0

Oui! Je vous remercie! Cela a fonctionné totalement pour moi, en mettant un grand script de schéma initial dans un fichier .sql simple et en l'appelant à partir d'une balise changeset avec une balise ' – JMB

3

J'ai récemment reçu cette question. endDelimiter devrait être:

endDelimiter="(?m)^/$" 
+1

Superbe! C'est une version beaucoup plus propre du délimiteur de travail! Grand merci! P.S. Pour l'utiliser dans les ensembles de modifications SQL brutes, vous devez le spécifier sans les interruptions: endDelimiter :(? M) ^/$ – Serzhas

Questions connexes