Results 1 to 10 of 10

Thread: firebird create ext table werkt niet

  1. #1

    firebird create ext table werkt niet

    Hallo,

    Om het importeren van een flinke hoeveelheid data in de database sneller te laten verlopen ben ik aan de slag gegaan met een externe tabel
    (zie http://www.firebirdfaq.org/faq209/)
    Echter wanneer ik deze code uitvoer krijg ik de volgende foutmelding

    'A node name is not permitted in a table with external file definition."

    Deze melding krijg ik ook wanneer ik een externe tabel probeer aan te maken via mijn EMS database manager.

    Als ik op de foutcode zoek krijg ik een heleboel hits echter ik krijg geen oplossing.

    Heeft iemand van jullie hier evaring mee

  2. #2
    Voer je de exacte code (met exact zelfde externe bestand) uit?
    Zorg ervoor dat je niet exact c:\myfile.txt gebruikt maar bijvoorbeeld een bestand in c:\temp\myfile.txt
    Je hebt geen rechten in de root directory.
    Ook netwerkpaden moet je niet gebruiken.

    Dus wat is de exacte code?

  3. #3
    hierbij de code, schrijf dus wel naar de H schijf, zal eens kijken of het wel werkt op c:\temp ofzo

    Code:
      sql:= 'CREATE TABLE ext1 EXTERNAL ' +  quotedstr('H:\myfile.txt')  +
            ' (Tekeningnr char(20), Omschrijving varchar(20), processId integer, duur float)';
      FireBirdDB.query.SQL.Clear;
      FireBirdDB.query.sql.add(sql);
      FireBirdDB.query.prepare;
      FireBirdDB.query.execSql;
      FireBirdDB.commit;

  4. #4
    Als H een netwerkschijf is (net use driveletter) dan zal daar het probleem liggen.

  5. #5
    Yep op c:\temp\...txt werkt het wel
    Op naar het volgend probleem

  6. #6
    kan nu de tabel aanmaken en via GRANT SELECT, INSERT, DELETE, UPDATE ON EXT1 TO PUBLIC zodat ik schrijfrechten heb.
    Echter wanneer ik de data probeer te schrijven of laden krijg ik de volgende error code

    access to external file c:\temp... is denied by server administration
    SQl code -902
    IB error number 335544831

    Heb nu in de netwerkadapter NetBios op enabled gezet op de lokale computer (wellicht dat dit ook moet de server)

    Kortom even snel een extrne tabel aanmaken zat er niet in vandaag.
    Mochten jullie tips en tricks hebben dan hoor ik die graag

    Groet

  7. #7
    Volgens mij moet je voor schrijven in external files ook de firebird.conf nog aanpassen.

    # ----------------------------
    # External File Paths/Directories
    #
    # ExternalFileAccess may be None, Full or Restrict. If you choose
    # Restrict, provide ';'-separated trees list, where external files
    # are stored. Relative paths are treated relative to RootDirectory entry
    # (see above). Default value 'None' disables any use of external files
    # on your site. To specify access to specific trees, enum all required
    # paths (for Win32 this may be something like 'C:\ExternalTables',
    # for unix - '/db/extern;/mnt/extern').
    #
    Hence the single-quotes. And here is the current configuration, which works:
    #
    ExternalFileAccess = Restrict C:\Temp;
    En restart firebird.

  8. #8
    en ik dacht dat doe ik even zo'n externe tabel, maar het blijkt meer voeten in aarde te hebben dan bedacht.
    Ik heb de conf file aangepast maar kan de server pas in het weekend herstarten.

    De reden dat ik begonnen met een external file is om een import routine te versnellen.
    Wellicht kan ook mijn huidige code versneld worden
    Ziet iemand hier nog verbeterpunten

    Code:
      sql := 'Insert into ProcessVoorCalc'+
             '(Tekeningnr, processId, duur)' +
             ' values '+
             '(:Tekeningnr, :processId, :duur)' ;
      FireBirdDB.query.SQL.Clear;
      FireBirdDB.query.sql.add(sql);
      FireBirdDB.query.prepare;
    
      for i := 1 to   xExport.ActiveWorkSheet.Rows.Count - 1 do
      begin
        FireBirdDB.Query.ParamByName('Tekeningnr').Value:= xExport.ActiveWorkSheet.Rows[i].Cells[0].SqlText;
        FireBirdDB.Query.ParamByName('ProcessID').AsInteger := strtoint(xExport.ActiveWorkSheet.Rows[i].Cells[1].SqlText);
        FireBirdDB.Query.ParamByName('Duur').AsSingle := strtofloat(xExport.ActiveWorkSheet.Rows[i].Cells[2].SqlText);
        FireBirdDB.query.execSql;
         if ((i mod 50) =0 ) and assigned(FOnUpdate) then
         FOnUpdate(self,'Voortgang aantal records: ' + i.ToString + ' van ' +xExport.ActiveWorkSheet.Rows.Count.toString);
      end;
    
      FireBirdDB.commit;

  9. #9
    Kwam ook nog het sql statement Execute Block tegen
    Hiermee kan ik mijn huidige code aanzienlijk versnellen.
    In eerste instantie schrijf ik steeds 100 records per keer weg

    hierbij mijn code
    Code:
      xExport:=TOExport.Create;
      xExport.LoadFromFile(aFileName);
      xExport.ActiveWorkSheet:=xExport.WorkSheets.Find('Voorcalc');
      if xExport.WorkSheets.Find('Voorcalc')=nil then
      begin
       xExport.free;
       exit;
      end;
      xExport.ActiveWorkSheet.DeleteEmptyRowsFromEnd  ;
    
      sql:= 'delete from processvoorcalc';
      FireBirdDB.query.SQL.Clear;
      FireBirdDB.query.sql.add(sql);
      FireBirdDB.query.prepare;
      FireBirdDB.query.execSql;
      FireBirdDB.commit;
    
      sql:= 'execute block as begin ';
    
      for i := 1 to xExport.ActiveWorkSheet.Rows.Count - 1 do
      begin
        sql:=sql+'insert into ProcessVoorcalc values('+
                  quotedstr(xExport.ActiveWorkSheet.Rows[i].Cells[0].SqlText)+ ', '+
                  quotedstr(' ') + ', '+
                  xExport.ActiveWorkSheet.Rows[i].Cells[1].SqlText+ ', '+
                  xExport.ActiveWorkSheet.Rows[i].Cells[2].SqlText+ '); ';
    
        if (i mod 100) =0 then
        begin
         sql:=sql+ 'End';
         FireBirdDB.query.SQL.Clear;
         FireBirdDB.query.sql.add(sql);
         FireBirdDB.query.prepare;
         FireBirdDB.query.execSql;
         if assigned(FOnUpdate) then
         FOnUpdate(self,'Voortgang aantal records: ' + i.ToString + ' van ' +xExport.ActiveWorkSheet.Rows.Count.toString);
         sql:= 'execute block as begin ';
        end;
    
      end;
      FireBirdDB.commit;
      xExport.free;

  10. #10
    Quote Originally Posted by cpri View Post
    access to external file c:\temp... is denied by server administration
    SQl code -902
    De Database Service draait onder een geconfigureerd user account. Standaard zal dat een restrictief account zijn. Ik verwacht dat dat account geen toegang heeft tot de netwerk schijf en ook niet kan schrijven naar het bestand waar je hem nu hebt staan. Als mogelijk, configureer de Service onder een ander account. Best dat je daarvoor een apart user account maakt die je de schrijf rechten geeft die nodig zijn
    Last edited by havezet; 13-Apr-20 at 10:15.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •