Announcement

Collapse
No announcement yet.

SQl-Sript über bestehende Interbase DB laufen lassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQl-Sript über bestehende Interbase DB laufen lassen

    Ist es möglich einen SQL-Script über eine bestehende Datenbank laufen zu lassen. Dabei soll geprüft werden ob die DB die Tabellen und Spalten enthält die im SQL-Skript "gefordert" werden.

    If NOT EXISTS MYTABLE THEN CREATE TABLE MYTABLE

    Auf diese vielleicht verückte Idee bin ich gekommen, weil es in C:\Programme\Microsoft Office\Office\Samples\Nordwindcs.sql in etwa so aussieht. Dort ist es zwar ein Microsoft SQL-Skript aber die sollten sich ja im Grunde "kaum" unterscheiden.

  • #2
    Du brauchst "etwas" was dein SQL Skript auswertet, und da bietet dir InterBase nur Stored Procs und da bekommst Du dein Craete Table nicht rein.

    Wenn Du allerding was hast oder schreibst was ein Skript im Client auswertet, dann kannst du mit select count(*) from rdb$relations where rdb$relation_name = 'TRARALA' prüfen ob eine Tabelle Tralala schon da ist.

    Es gibt allerdings allerhand Tools (siehe www.ibphoenix.com) die Metadaten abgleichen und die passende Skripts erzeugen, wir arbeiten wenn die Zeit es zuläßt auch gerade an etwas was direkt zwei DB's ohne Skript dazwischen abgleicht.

    &#10

    Comment


    • #3
      Vielen Dank zunächst für den Hinweis. Hätte mich sonst sicher zu tode gesucht.

      Ich werde mich jetzt für

      Wenn Du allerding was hast oder schreibst was ein Skript im Client auswertet, dann kannst du mit select count(*) from rdb$relations where rdb$relation_name = 'TRARALA' prüfen ob eine Tabelle Tralala schon da ist.

      entscheiden.

      Wenn sich auf diese Weise herausstellt, dass die Tabelle fehlt so möchte ich diese natürlich (im Client mit Delphi per SQL) auch anlegen.

      Dazu verwende ich einen IBSQL Komponente.

      Die Domains, und Generatoren können bei Bedarf auch erstellt werden nur stehe ich jetzt vor dem Problem, dass ich die Tabellen nicht anlegen kann.

      <pre>
      procedure PRO_SQL();
      Procedure PRO_IBSQL_CLEARANDEXEC;
      begin
      with DMMedicalExp.IBSQL1 do
      begin
      ExecQuery;
      SQL.Clear;
      end;
      end;

      begin
      try
      DMMedicalExp.IBTransaction1.StartTransaction;
      with DMMedicalExp.IBSQL1 do
      begin
      //* Domains der Datenbank festlegen */
      Sql.Add(' CREATE DOMAIN DOM_BOOLEAN AS');
      Sql.Add(' VARCHAR(1)');
      Sql.Add(' NOT NULL');
      Sql.Add(' CHECK (VALUE BETWEEN 0 AND 1);');
      PRO_IBSQL_CLEARANDEXEC;
      Sql.Add(' CREATE DOMAIN DOM_DRAGZONE AS');
      Sql.Add(' VARCHAR(4)');
      Sql.Add(' CHECK');
      Sql.Add(' (VALUE BETWEEN 0 AND 350)');
      Sql.Add(' NOT NULL;');
      PRO_IBSQL_CLEARANDEXEC;
      // usw.
      //* Generatoren festlegen */'
      Sql.Add(' CREATE GENERATOR GEN_IBDF_TYP;');
      PRO_IBSQL_CLEARANDEXEC;
      Sql.Add(' CREATE GENERATOR GEN_IBDF_USER;');
      PRO_IBSQL_CLEARANDEXEC;
      // usw.

      Sql.Add('CREATE TABLE IBT_FACHRICHTUNG');
      Sql.Add(' IBDF_FACHRICHTUNG ');
      Sql.Add(' IBDF_FACHRICHTUNG_BEZEICHNUNG VARCHAR(50) NOT NULL,');
      Sql.Add(' IBDF_FACHRICHTUNG_BESCHREIBUNG VARCHAR(250),');
      Sql.Add(' PRIMARY KEY(IBDF_FACHRICHTUNG)');
      PRO_IBSQL_CLEARANDEXEC;
      //usw.
      end;
      finally
      DMMedicalExp.IBTransaction1.Commit;
      end;
      end;
      </pre>
      beim PRO_IBSQL_CLEARANDEXEC ExecQuery kommt die Meldung Token Unkown VARCHAR

      Seltsamer weise kennt er VARCHAR aber doch bei den Domains

      Sql.Add(' VARCHAR(1)')

      Comment


      • #4
        Hallo René,<br><br>
        das letzte Statement zum Erzeugen der Tabelle ist nicht richtig.<br>
        <ul>
        <li>Nach dem Tabellenname gehört eine runde Klammer</li>
        <li>Für die Spalte IBDF_FACHRICHTUNG hast keinen Datentyp und NOT NULL angegeben</li>
        <li>Am Schluß des Statements gehört wiederum eine runde Klammer</li>
        </ul><br>
        Also vergleichbar zu:<br><br>
        Sql.Add('CREATE TABLE IBT_FACHRICHTUNG (');<br>
        Sql.Add(' IBDF_FACHRICHTUNG INTEGER NOT NULL,');<br>
        Sql.Add(' IBDF_FACHRICHTUNG_BEZEICHNUNG VARCHAR(50) NOT NULL,');<br>
        Sql.Add(' IBDF_FACHRICHTUNG_BESCHREIBUNG VARCHAR(250),');<br>
        Sql.Add(' PRIMARY KEY(IBDF_FACHRICHTUNG));');<br>
        <br><br>
        Thomas Steinmaurer<br>
        http://www.iblogmanager.co
        Thomas Steinmaurer

        Firebird Foundation Committee Member
        Upscene Productions - Database Tools for Developers
        Mein Blog

        Comment


        • #5
          Hallo Thomas,

          klar hätte mir auch auffallen können, aber nach Kopieren aus der Datei in Excel und anschließendem verketten usw. usw. sah ich wohl vor lauter Wald die Bäume nicht mehr.

          Vielen Dank also noch mal

          Comment


          • #6
            zudem mache ich create domain immer ohne "as" es mag aber auch mit gehe

            Comment

            Working...
            X