* * * *
13 Visitatori, 0 Utenti

Autore Topic: Allineare tabelle  (Letto 15747 volte)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2669
  • Karma: +9/-0
Allineare tabelle
« il: Febbraio 16, 2014, 09:59:46 pm »
Ciao ragazzi, ho il seguente problema.

Ho due database residenti su macchine diverse e voglio allineare una di queste tabelle. Chiamiato i due database come: db1 e db2 e le tabelle come tab1 e tab2 (ovviamente tab1 e tab2 hanno la stessa struttura ma hanno database diversi).

Ora per evitare di cancellare i dati tutte le volte da tab2 e ricopiarli da tab1 vorrei cancellare e reinserire le righe che davvero vengono modificate).

Mi basta un trigger per le righe inserite o modificate. Ma per le righe cancellate come posso fare? Vorrei evitare di dover cancellarle solo logicalmente.

Suggerimenti?

Grazie mille
Ieri è passato, domani è futuro, oggi è un dono...

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1967
  • Karma: +4/-0
Re:Allineare tabelle
« Risposta #1 il: Febbraio 17, 2014, 09:33:05 am »
Che Engine usi?

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2669
  • Karma: +9/-0
Re:Allineare tabelle
« Risposta #2 il: Febbraio 17, 2014, 02:30:44 pm »
Io uso Firebird
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:Allineare tabelle
« Risposta #3 il: Febbraio 17, 2014, 03:39:27 pm »
devi fare una tabella di log per le eliminazioni

a dire il vero io farei una tabella di log per tutto: insert, update e delete con tanto di progressivo (come PK) per riproporre le sequenza.
nel database di destinazione ti devi segnare l'ultimo progressivo eseguito così alla prossima sincronizzazione riprendi da li.
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2669
  • Karma: +9/-0
Re:Allineare tabelle
« Risposta #4 il: Febbraio 17, 2014, 04:58:27 pm »
devi fare una tabella di log per le eliminazioni

a dire il vero io farei una tabella di log per tutto: insert, update e delete con tanto di progressivo (come PK) per riproporre le sequenza.
nel database di destinazione ti devi segnare l'ultimo progressivo eseguito così alla prossima sincronizzazione riprendi da li.

Idea che mi era già frullata in testa. Solo che io quei dati li modifico da una dbgrid e quindi mi rimane difficile da gestire come dici tu. In quanto modificando da tabella non uso delle query da inserire nella tabella di log, e le mie tabelle da allineare hanno PK composte diverse da tabella a tabella.
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:Allineare tabelle
« Risposta #5 il: Febbraio 17, 2014, 07:00:15 pm »
il log bisognerebbe gestirlo con un trigger direttamente dentro il database
per quanto riguarda le chiavi composte diverse da tabella a tabella potresti fare così:

1) tabella LOG_MASTER (campi: (1) PK autoincrementale (2) nome tabella di cui si deve replicare il record)
2) tabella LOG_DETAIL_TABLE1 (campo (1) FK autoincrementale  (2..) n. campi come da chiave composta per TABLE 1)
3) tabella LOG_DETAIL_TABLE2 (campo (1) FK autoincrementale  (2..) n. campi come da chiave composta per TABLE 2)
4) tabella LOG_DETAIL_TABLEN (campo (1) FK autoincrementale  (2..) n. campi come da chiave composta per TABLE N)

Nelle tabelle detail, ad esempio TABLE 1, nel trigger after insert, update e delete, fai in inserimento in LOG_MASTER ed uno in LOG_DETAIL_TABLEx

Non è sicuramente una struttura facile, ma dovrebbe essere sufficientemente elastica.
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2669
  • Karma: +9/-0
Re:Allineare tabelle
« Risposta #6 il: Febbraio 18, 2014, 03:58:05 pm »
Mi sa che mi richiede più fatica che non cancellarlo logicamente.

Per caso altre idee?!
Ieri è passato, domani è futuro, oggi è un dono...

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1967
  • Karma: +4/-0
Re:Allineare tabelle
« Risposta #7 il: Febbraio 19, 2014, 01:15:21 am »
Idee che mi vengono al volo.
1)
DELETE * FROM TARGET_TABLE;
SELECT * FROM SOURCE_TABLE;
ALTER TABLE TARGET_TABLE DROP INDEX ....
ALTER TABLE TARGET_TABLE DROP CONSTRAINT ....
Per ogni riga estratta...

INSERT (...) INTO TARGET_TABLE VALUES(...);

Alla fine:
ALTER TABLE TARGET_TABLE ADD CONSTRAINT ....
CREATE INDEX ON TARGET_TABLE ....

Lunghetto e noioso da fare tutto a mano ... :(

Con oracle esistono altri sistemi. Più "eleganti". E si arrangia il motore sql ;)
TRUNCATE TARGET_SCHEMA.TARGET_TABLE;
INSERT INTO TARGET_SCHEMA.TARGET_TABLE VALUE(SELECT * FROM SOURCE_SCHEMA.SOURCE_TABLE);
(Prima devi anche disabilitare gli indici e constraint, in modo che l'insert sia più rapido, poi attivi tutti i costraint e gli indici alla fine... trucchetti da datawarehose).

Firebird non so se supporti questo tipo di sintassi.

E' una logica stupida e va contro la tua richiesta. Ma è quella più semplice da realizzare.
In una banca di cui non ti dico il nome, il riversare i dati da una tabella all'altra era "veloce".
Quando attivavi gli indici si "inchiodava" Oracle ... le cpu schizzavano al 90% .. e stiamo parlando di macchinine di una certa potenza di calcolo. AIX o Solaris dentro Mainframe. ;)
2
(2.1)L'alternativa è tracciare quello che fa l'utente sulla tabella.
Aggiungere un campo con uno "stato". Modificato, Inserito, Cancellato.
Ma poi è una noce lavorare in modo ordinario sulle righe.

Valuta tu.
Questa operazione di ribaltamento deve essere fatta ad ogni operazione o sporadicamente.
(2.2)Nel secondo caso ranza la tabella e caccia tutto dentro senza tante remore.
Se anche ci mette un'oretta (ammesso che la tabella sia molto "piena") l'utente aspetta.

E' un'operazione da fare ad ogni transazione?
Allora l'applicativo deve eseguire le modifiche su entrambe le tabelle.
Configura gli alias e le connessioni in modo fa eseguire una sorta di "raid" se fossero dischi. ;)

3)
Poi anche un export su file ed un import poi, potrebbe essere una soluzione.
Monti una tabella come file csv dalla tabella source.
Copi tutto dentro.
Monti il file come tabella sul db target. Copi tutto dentro sul secondo db.

Poi i file puoi postarli in ftp, per mail, piccione viaggiatore, segnali di fumo. Solo la tua fantasia/pigrizia ti sarà di ostacolo.

Spero di averti confuso le idee più di prima :D

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:Allineare tabelle
« Risposta #8 il: Febbraio 19, 2014, 04:09:46 pm »
fbexport o fbcopy
http://fbexport.sourceforge.net/

secondo me è meglio che fai con questi ;)
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2669
  • Karma: +9/-0
Re:Allineare tabelle
« Risposta #9 il: Febbraio 19, 2014, 05:37:26 pm »
Alla fine mi sono reso conto che o già due campi che mi permettono di rendere il record inutilizabile dal resto del programma. Quindi alla fine li uso come cancellazione logica (così mi mantiene anche una storicità della cosa) e mi gestisco la modifica e l'inserimento con un trigger. Ho perso del tempo inutilmente insomma.

@Stilgar: avevo pensato anche io che gli indici potessero ridurre notevolmente le prestazioni. Farò delle prove e ti dirò al riguardo.
Ieri è passato, domani è futuro, oggi è un dono...

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2669
  • Karma: +9/-0
Re:Allineare tabelle
« Risposta #10 il: Febbraio 19, 2014, 06:23:38 pm »
Ora però ho bisogno di capire come renderlo fattibile.

Allora ho creato il campo RECORD_EDIT_INSERT SMALLINT attraverso la query:

ALTER TABLE LISTINO_PREZZI_PV ADD RECORD_EDIT_INSERT SMALLINT default 0 not null;

Poi vado per creare il trigger con la seguente sintassi

Codice: [Seleziona]
CREATE TRIGGER MODIFICA_INSERIMENTO_LISTINI_PV for LISTINO_PREZZI_PV
Active
After insert or update
Position 0
AS
BEGIN
     -- ogni volta che inserisco o
     -- modifico un record vado ad
     -- impostare il campo RECORD_EDIT_INSERT
     -- a 1 in modo che nel trasferire i dati
     -- ai punti vendita io trasferisco solo le
     -- righe essenziali
     -- la cancellazione è bloccata dal programma
     -- semplicemente rendo i record non continuativi
     -- e con la data di inizio vendita e di fine vendita
     -- impostata a 1-1-1900

     new.RECORD_EDIT_INSERT=1;

END;

Applico la creazione del trigger ed è ok, quando però applico la commit retaining mi visualizza questo popup

 : CommitRetaining :
 -attempted update of read-only column

Uso Turbobird, sapete cosa può essere? Dove sbaglio?

Inoltre ho un dubbio amletico: quando poi voglio risettare la colonna RECORD_EDIT_INSERT a 0 come posso fare senza che il trigger entri in funzione?
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:Allineare tabelle
« Risposta #11 il: Febbraio 19, 2014, 06:57:37 pm »
Inoltre ho un dubbio amletico: quando poi voglio risettare la colonna RECORD_EDIT_INSERT a 0 come posso fare senza che il trigger entri in funzione?

potresti fare la replicazione con una connessione a parte dove ti colleghi con un utente tipo 'XINYREPL'
nel trigger condizioni il codice in modo da essere eseguito solo quando l'utente corrente non è 'XINYREPL'
Imagination is more important than knowledge (A.Einstein)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:Allineare tabelle
« Risposta #12 il: Febbraio 19, 2014, 06:58:50 pm »

Applico la creazione del trigger ed è ok, quando però applico la commit retaining mi visualizza questo popup

 : CommitRetaining :
 -attempted update of read-only column


nella tabella fai uso di campi calcolati?
puoi postare la "create table"?
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2669
  • Karma: +9/-0
Re:Allineare tabelle
« Risposta #13 il: Febbraio 19, 2014, 07:16:01 pm »
Nessun campo calcolato, ecco la create

create table LISTINO_PREZZI_PV (
CHIAVE_PV CHAR(10)  not null ,
ARTICOLO VARCHAR(50)  not null ,
PREZZO_A Numeric(9,2) ,
PREZZO_V Numeric(9,2) ,
VALUTA_A VARCHAR(20) ,
VALUTA_V VARCHAR(50) ,
IDENTIFICATIVO_LISTINO INTEGER not null ,
CATEGORIA VARCHAR(50) ,
IVA FLOAT,
RAGGRUPPAMENTO_ARTICOLO VARCHAR(255) ,
ORDINE_RAGGRUPPAMENTO_ARTICOLO INTEGER,
DATA_INIZIO_VENDITA DATE,
DATA_FINE_VENDITA DATE,
CONTINUATIVO CHAR(1)  default '0',
ID_CATEG_MERC INTEGER,
UTENTE_MODIFICA_RECORD VARCHAR(255) ,
TIPOLOGIA_PRODOTTO CHAR(1)  default '0',
INFO1 VARCHAR(50) ,
INFO2 VARCHAR(50) ,
INFO3 VARCHAR(50) ,
RECORD_EDIT_INSERT SMALLINT default 0 not null
, constraint IX_LISTINO_PREZZI_PV_1 primary key (CHIAVE_PV, ARTICOLO, IDENTIFICATIVO_LISTINO)
);
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:Allineare tabelle
« Risposta #14 il: Febbraio 19, 2014, 07:40:46 pm »
non saprei, non ha molto senso
prova a lanciare le stesse istruzioni sql con flamerobin
Imagination is more important than knowledge (A.Einstein)

 

Recenti

How To

Trascinare un file nel programma da xinyiman
DB concetti fondamentali e ZeosLib da xinyiman
Recuperare codice HTML da pagina web da xinyiman
Mandare mail con Lazarus da xinyiman
Stabilire il sistema operativo da xinyiman
Esempio lista in pascal da xinyiman
File INI da xinyiman
Codice di attivazione da xinyiman
Realizzare programmi multilingua da xinyiman
Lavorare con le directory da xinyiman
Utilizzare Unità esterne da Loryea
TTreeView da xinyiman
TTreeview e Menu da xinyiman
Generare controlli RUN-TIME da xinyiman
LazReport, PDF ed immagini da xinyiman
Intercettare tasti premuti da xinyiman
Ampliare Lazarus da xinyiman
Lazarus e la crittografia da xinyiman
System Tray con Lazarus da xinyiman
UIB: Unified Interbase da Microges2000
Il file: questo sconosciuto da Microges2000
Conferma di chiusura di un applicazione da xinyiman
Liste e puntatori da Microges2000
Overload di funzioni da Microges2000
Funzioni a parametri variabili da Microges2000
Proprietà da Microges2000
Conversione numerica da Microges2000
TImage su Form e Panel da Maverich
Indy gestiore server FTP lato Client da Maverich
PopUpMenu sotto Pulsante (TSpeedButton) da Maverich
Direttiva $macro da Microges2000
Toolbar da xinyiman
Evidenziare voci TreeView da Maverich
Visualizzare un file Html esterno da Maverich
StatusBar - aggirare l'errore variabile duplicata da Maverich
Da DataSource a Excel da xinyiman
Le permutazioni da xinyiman
Brute force da xinyiman
Indy 10 - Invio email con allegati da Maverich
La gestione degli errori in Lazarus da xinyiman
Pascal Script da xinyiman
Linux + Zeos + Firebird da xinyiman
Dataset virtuale da xinyiman
Overload di operatori da Microges2000
Lavorare con file in formato JSON con Lazarus da nomorelogic
Zeos ... dietro le quinte (prima parte) da Stilgar
Disporre le finestre in un blocco unico (come Delphi) da Maverich
Aspetto retrò (Cmd Line) da xinyiman
Come interfacciare periferica twain da Narciso
Ubuntu - aggiornare free pascal e lazarus da xinyiman
fpcup: installazioni parallele di lazarus e fpc da nomorelogic
Free Pascal e Lazarus sul Raspberry Pi da nomorelogic
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal. da nomorelogic
Creare un server multithread da xinyiman
guida all'installazione di fpc trunk da subversion in linux gentoo da nomorelogic
Indice da nomorelogic
DB concetti fondamentali e connessioni standard da xinyiman
Advanced Record Syntax da nomorelogic
DB concetti fondamentali e DBGrid da xinyiman
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText da xinyiman
Advanced Record Syntax: un esempio pratico da nomorelogic
Superclasse form base per programmi gestionali (e non) da nomorelogic
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox da nomorelogic
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form da nomorelogic
Superclasse form base per programmi gestionali (e non) #4 - wait animation da nomorelogic
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog da nomorelogic
Installare lazarus su mac osx sierra da xinyiman
immagine docker per lavorare con lazarus e free pascal da nomorelogic
Utenti
Stats
  • Post in totale: 12633
  • Topic in totale: 1570
  • Online Today: 25
  • Online Ever: 520
  • (Novembre 04, 2018, 12:00:31 pm)
Utenti Online
Users: 0
Guests: 13
Total: 13

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.