IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

FB 2.5 Copie de table sur 2 bases


Sujet :

SQL Firebird

  1. #1
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut FB 2.5 Copie de table sur 2 bases
    Bonjour,

    J'ai besoin de faire une copie du contenu d'une table dans une autre table d'une autre base ayant la même structure.
    J'ai bien trouvé des infos sur la manière de travailler sur une table externe via



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For EXECUTE STATEMENT 
        'SELECT * FROM TBL ...' 
        ON EXTERNAL  server etc.
    DO SUSPEND;
    END
    Mais ce que je souhaiterais faire, si c'est possible, c'est un truc du genre:
    INSERT INTO ServerExterne:TblTarget SELECT * FROM TblSource WHERE...

    où ServerExterne:TblTarget est le serveur et la table de la base externe.
    L'objectif étant de ne pas avoir à lister chaque champ pour avoir un block commun pour toutes les tables que je veux copier.
    Ce n'est peut être pas possible, mais si on ne demande pas...


    merci,






    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    à priori je ne vois pas pourquoi cela serait impossible (avec FB 2.5 bien sur)
    jusqu'à présent je n'avais fait ce genre de choses qu'avec des triggers de ce style
    (à noter l'utilisation des paramètres dans le EXECUTE STATEMENT)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    -- ACHEMINEMENT ------------------------------------------------------------------
    SET TERM ^ ;
    CREATE TRIGGER AUI_ACHEMINEMENT FOR ACHEMINEMENT
    ACTIVE AFTER INSERT OR UPDATE POSITION 0
    AS
    DECLARE VARIABLE STMT VARCHAR(250); 
    BEGIN 
        STMT='UPDATE OR INSERT INTO ACHEMINEMENT (CODE, LIBELLE)
         VALUES (?,?)';
     
    	EXECUTE STATEMENT 
    	(STMT)(NEW.CODE,NEW.LIBELLE)
    	ON EXTERNAL DATA SOURCE 'localhost:OMJBase' AS USER 'SYSDBA' PASSWORD '****';
    END^
    SET TERM ; ^
     
    SET TERM ^ ;
     
    CREATE TRIGGER AD_ACHEMINEMENT FOR ACHEMINEMENT
    ACTIVE AFTER DELETE POSITION 0
    AS
    DECLARE VARIABLE STMT VARCHAR(250); 
    BEGIN 
     STMT='DELETE FROM ACHEMINEMENT WHERE CODE=?';
     EXECUTE STATEMENT (STMT)(OLD.CODE)
     ON EXTERNAL DATA SOURCE 'localhost:OMJBase' AS USER 'SYSDBA' PASSWORD '****'; 
    END^
     
    SET TERM ; ^
    ou plus complexe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    SET TERM ^ ;
    CREATE TRIGGER AUI_ASSORTS FOR ASSORTS
    ACTIVE AFTER INSERT OR UPDATE POSITION 0
    AS
    DECLARE VARIABLE STMT VARCHAR(2500); 
    BEGIN 
    STMT='UPDATE OR INSERT INTO ASSORTS (NOM,ASSORTIMENT,DESCRIPTION,PAIRES_MINI,PAIRES_MAXI,CODE_NOMEN,CODE_GAMME,TYPE,'||
         'LAST_UTIL,LAST_MODIF,PRIX_CESSION,DELAI,SAISON,DISPO_DU,DISPO_AU,QM1,QM2,QM3,QM4,QM5,QM6,QM7,QM8,QM9,'||
         'QM10,QM11,QM12,QM13,QM14,QM15,QM16,QM17,QM18,QM19,QM20,QM21,QM22,QM23,QM24,NOMEN_EXPORT,QUNITE,ALLOWABLE,'||
         'AT1,AT2,AT3,AT4,AT5,SITE,CASIER,GESTION_MINIMA) '||
         'VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
    EXECUTE STATEMENT (STMT)(NEW.NOM,NEW.ASSORTIMENT,NEW.DESCRIPTION,NEW.PAIRES_MINI,NEW.PAIRES_MAXI,NEW.CODE_NOMEN,NEW.CODE_GAMME,
                             NEW.TYPE,NEW.LAST_UTIL,NEW.LAST_MODIF,NEW.PRIX_CESSION,NEW.DELAI,NEW.SAISON,NEW.DISPO_DU,NEW.DISPO_AU,NEW.QM1,NEW.QM2,NEW.QM3,    
                             NEW.QM4,NEW.QM5,NEW.QM6,NEW.QM7,NEW.QM8,NEW.QM9,NEW.QM10,NEW.QM11,NEW.QM12,NEW.QM13,NEW.QM14,NEW.QM15,NEW.QM16,NEW.QM17,NEW.QM18,
                             NEW.QM19,NEW.QM20,NEW.QM21,NEW.QM22,NEW.QM23,NEW.QM24,NEW.NOMEN_EXPORT,NEW.QUNITE,NEW.ALLOWABLE,NEW.AT1,NEW.AT2,NEW.AT3,NEW.AT4,
                             NEW.AT5,NEW.SITE,NEW.CASIER,NEW.GESTION_MINIMA)
    ON EXTERNAL DATA SOURCE 'localhost:OMJBase' AS USER 'SYSDBA' PASSWORD '****'; 
    END^
     
    SET TERM ; ^
    par curiosité j'ai essayé une copie de table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SET TERM # ;
     
    EXECUTE block AS 
    DECLARE STMT VARCHAR(80);
    BEGIN
     STMT='INSERT INTO ACH_BIS SELECT * FROM ACHEMINEMENT';
     EXECUTE STATEMENT (STMT)
      ON EXTERNAL DATA SOURCE 'localhost:OMJBase' AS USER 'SYSDBA' PASSWORD '****';
    END#
     
    SET TERM ;#
    et cela fonctionne
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Et bien ça me parait être exactement ça sur le dernier exemple.
    Je vais faire ça et merci parce que la syntaxe de ce type de sql est un peu difficile à trouver.
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  4. #4
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    SergioMaster,

    Il y a un truc qui me chiffone quand même, là tu prends un exemple où les deux tables n'ont pas le même nom.
    Mais, dans mon cas elles ont le même nom, comment faire pour que le système n'est pas d'ambiguité entre la source et la destination ?
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    re,

    Citation Envoyé par castorcharly Voir le message
    Il y a un truc qui me chiffonne quand même, là tu prends un exemple où les deux tables n'ont pas le même nom.
    Mais, dans mon cas elles ont le même nom, comment faire pour que le système n'est pas d’ambiguïté entre la source et la destination ?
    ah oui , mais j'ai fait l'essai sur deux bases déjà existantes et cette table déjà remplie avait des contraintes ce qui fait que je ne pouvais la vider pour ensuite la ré-remplir.
    c'est bien sûr à vérifier ,
    Aussi tôt dit , aussi tôt fait et effectivement il y a confusion et je n'ai vu nulle part le moyen d'utiliser un nom alias pour le reste je suis parti de ce document
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    SergioMaster, effectivement là ça ne marche pas.
    Dans la SQL le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into tbl1 select * from tbl2 where id =...
    tbl1 et tbl2 doivent appartenir à la base target, tbl2 n'est pas celle de la base source.

    Du coup, je cherche, mais j'ai peu d'espoir...
    Si je trouve je reviens le dire ici.
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  7. #7
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Dans le document il y a cet exemple, mais je ne comprends pas tout:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ...declare license_num varchar(15);
    declare connect_string varchar(100);
    declare stmt varchar(100) =
      'select license from cars where driver = :driver and location = :loc';
    begin
      ...
      select connstr from databases where cust_id = :id into connect_string;
      ...
      for select id from drivers into current_driver do
      begin  
        for select location from driver_locations
          where driver_id = :current_driver
          into current_location do
        begin
          ...
          execute statement (stmt) (driver := current_driver,
                                       loc := current_location)
            on external connect_string
            into license_num;       ...
    Du coup pour l'utiliser et tenter de le modifier c'est pas gagné, je ne comprends même pas ce que cherche à faire cette SQL...
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Re,

    Pour faire un truc "universel" effectivement cela me parait compromis sauf si on pouvait utiliser un alias de table ou une distinction de base (genre base:table)
    maintenant pour une copie de table fbcopy existe


    pour ce qui est du document cet exemple utilise des paramètres pour passer les valeurs pour reprendre l'exemple de ma table ACH_BIS ce serait simple (comme dans mes 2 premiers codes de triggers)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE VARIABLE C CHAR(1);
    DECLARE VARIABLE L VARCHAR(20);
    DECLARE STMT VARCHAR(80);
    BEGIN
    STMT='INSERT INTO ACH_BIS VALUES (?,?)';
    FOR SELECT CODE,LIBELLE FROM ACH_BIS  INTO :C,:L DO
     BEGIN
         EXECUTE STATEMENT (STMT)(:C,:L) 
         ON EXTERNAL .....  
     END
    mais du coup, cela ne correspond pas à ton objectif ("ne pas lister chaque champ")
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Copie de table sur une base SQL Server 2005
    Par stephyugh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/04/2008, 13h30
  2. copie de table entre 2 bases en ADO
    Par sebstras dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/09/2006, 09h33
  3. Réponses: 1
    Dernier message: 13/05/2006, 06h07
  4. Jointure de tables sur 2 base MySQL, si poussible??
    Par nerik38 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/11/2005, 20h12
  5. copie de tables entre deux bases
    Par rlgrand dans le forum Débuter
    Réponses: 3
    Dernier message: 27/12/2004, 12h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo