[SQL] Welke velden zijn geüpdatet, verwijdert of toegevoegd

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michael -

Michael -

28/10/2016 21:29:54
Quote Anchor link
Hoi,

Het zou leuk zijn om weer te kunnen geven welke velden zijn geüpdatet, verwijdert of nieuw zijn toegevoegd.
Ik heb een script wat draait in crontab en nieuwe informatie ophaalt. In deze data kunnen gegevens verdwenen zijn, toegevoegd zijn of geüpdatet zijn. Het script verwijdert alle gegevens uit de tabel en voegt deze opnieuw toe.
Nou stuur ik me zelf wel een mail wanneer deze taak gedaan is en hoeveel rijen er zijn verwijdert en zijn toegevoegd, maar dat zegt verder niks.

Hoe zou ik kunnen achterhalen welke nieuw, verdwenen of bijgewerkt zijn? Het zou dan ook nog leuk zijn om te zien welke velden bijgewerkt zijn. Iets met een tijdelijke tabel misschien?

Edit:

Zoiets als dit maar dat is me niet heel duidelijk


Bvd!
Gewijzigd op 28/10/2016 21:35:59 door Michael -
 
PHP hulp

PHP hulp

24/12/2024 17:00:18
 
Ben van Velzen

Ben van Velzen

29/10/2016 00:06:40
Quote Anchor link
Wat in die SO post omschreven wordt is het op basis van triggers in een logging tabel schrijven welke records toegevoegd en verwijderd zijn etc. Ik denk dat als je de historie wilt weten (en evt ook wilt terugschakelen) het gebruik maken van timetravel tabellen het handigst is.

Maar: wat is de reden dat je dit wilt kunnen zien? Vanuit daar kun je verder kijken naar een geschikte oplossing.
 
Pg Vincent

Pg Vincent

29/10/2016 09:07:13
Quote Anchor link
Problemen zoals dit zijn de reden waarom ik PostgreSQL gebruik: Voor het bijhouden van "de vorige versie" kun je een trigger gebruiken om de oude rij als een HSTORE op te slaan in een aparte tabel:

CREATE TABLE log_tabel (row_id INT, date_created TIMESTAMP, row_data HSTORE);
INSERT INTO log_tabel (row_id, date_created, row_data) SELECT CURRENT_TIMESTAMP, HSTORE(jouw_tabel.*) FROM jouw_tabel;

en om de nieuwe data te vergelijken met de oude kun je botweg de HSTORE van de nieuwe rij vergelijken met die van de oude:

SELECT HSTORE(jouw_tabel) - row_data FROM jouw_tabel INNER JOIN log_tabel ON jouw_tabel.id = log_tabel.row_id;

En hop, daar is je verschil.
Het leuke van HSTORE is dat het gewoon een rij accpeteert, dus als je een kolom toevoegt aan "jouw_tabel" dan verandert er niets aan de code die de hstore opslaat of aan de code die het verschil oplepelt.

Zelf gebruik ik de HSTORE voor auditing zodat ik van elke mutatie weet wanner hij gemaakt is en wat de inhoud van het record op dat moment geworden is. Dat is vooral belangrijk bij webshops waar mensen achteraf komen klagen dat ze "echt maar 3 stuks in het mandje hebben gelegd" of "hij gaf aan dat het 10 euro was, maar nu betaal ik 15".
 
Aad B

Aad B

29/10/2016 11:11:17
Quote Anchor link
versiebeheer in data, zijn boeken vol over geschreven. Met name in de energie en telecommarkt wordt vrijwel elk record bewaard. Er wordt wel functioneel ge-update meer niet fysiek. Meestal wordt er niet met van die HSTORE achtige functies gewerkt zoals Vincent aangeeft. In de grootzakelijke markt is "ijzer" meestal geen probleem en is alles online in productietabellen. Geen aparte tabellen en triggers in verband met overhead. Oracle databases van 15 Tb zijn heel gewoon en performance is geen probleem in geclusterd ijzer.
Wat ik hiermee wil zeggen is wat Ben al stelt: Wat wil je waarom weten/bewaren? Breng je functionele eis in beeld en bouw dat in met de geschikte engine. Ook MySQL (inmiddels ook van Oracle) kent triggers en procedures en ook grotere databases in MySQL kunnen een uitstekende performance leveren. Probleem is wel vaak dat in het webwereldje meer kennis is van html en php en beduidend veel minder van SQL. Ik kom regelmatig tegen dat hele bakken data uit MySQL worden opgehaald en in php arrays worden verwerkt, gesorteerd en gevalideerd om 2 records te vinden.
 
Pg Vincent

Pg Vincent

29/10/2016 15:33:20
Quote Anchor link
Quote:
In de grootzakelijke markt is "ijzer" meestal geen probleem


Absoluut, maar zijn hebben ook DBA's in dienst om de databases te beheren en ze hebben Terabytes aan werkgeheugen en verwerken duizenden mutaties per seconde en foo en bar... kortom ze lijken in de verste verte niet op het bedrijf waar de gemiddelde poster op PHPHulp voor werkt.

De gemiddelde webtoepassing heeft veel meer last van de overhead die een grote tabel ze geeft dan van een insert/update trigger.

Maar, laten we wachten op een omschrijving van wat de TS precies nodig heeft, en wat hij *kan* implementeren. Als hij een script van derven heeft dan zal het b.v. niet eens mogelijk zijn om versiebeheer in de tabel zelf te doen zonder triggers en views... daar ontkom je toch niet aan.
 
Michael -

Michael -

04/11/2016 08:35:35
Quote Anchor link
Quote:
Maar: wat is de reden dat je dit wilt kunnen zien? Vanuit daar kun je verder kijken naar een geschikte oplossing.

Nieuwsgierigheid ;-) Het is niet nodig, maar leuk om uit te proberen en te weten hoe zoiets werkt. Daarnaast is het altijd leuk om statistieken te krijgen van wat er gebeurt is na een insert/update.
 
Wesley -

Wesley -

04/11/2016 09:25:32
Quote Anchor link
Wat ik altijd doe is een soort status mee geven. 1 is actief, 2 is verlopen (als je iets met tijd hebt) en 9 is inactief (verwijderd). Deze records worden ook nooit verwijderd. Op mijn stage heb ik dit mee gekregen als tip, om nooit iets te verwijderen uit de db. Zet het gewoon op inactief, zo kun je deze dus ook uitlezen om te weten welke verwijderd is.

Zo kun je natuurlijk meer statussen mee geven. Je kan dus de status op 3 zetten als deze bewerkt is, al zie je dan niet wat er precies bewerkt is. Voor dat zou je echt voor de update de oude uitlezen en die in een aparte tabel zetten. (Ik werk niet met PostgreSQL etc, daar mijn mening op gebaseerd).
 
Ward van der Put
Moderator

Ward van der Put

04/11/2016 09:58:34
Quote Anchor link
Wesley - op 04/11/2016 09:25:32:
Wat ik altijd doe is een soort status mee geven. 1 is actief, 2 is verlopen (als je iets met tijd hebt) en 9 is inactief (verwijderd). Deze records worden ook nooit verwijderd.

Dat doe ik inderdaad vaak ook, maar dan met aparte DATETIME-kolommen. Bijvoorbeeld een aparte kolom last_modified is sowieso wel handig als je HTTP-headers goed wilt zetten voor caching.

Wat je daarnaast kunt doen, is opvallende of kritieke databasemutaties loggen naar een apart logbestand. Denk bijvoorbeeld aan het automatisch importeren van productfeeds: daarbij kan het handig zijn als je ergens een alert kunt triggeren bij opvallende prijswijzingen.

Aan data alleen heb je niets; het wordt pas informatie als je het ergens voor gebruikt. De hamvraag voor de TS is dus vooral: wat wil je weten?
 
Thomas van den Heuvel

Thomas van den Heuvel

04/11/2016 15:46:48
Quote Anchor link
^ what he said. Ook zou je kunnen denken aan versioning van dezelfde resource. Sla een gewijzigde variant gewoon op in een nieuw record en houd bij wat de meest recente versie van de resource is.
 
Michael -

Michael -

07/11/2016 22:51:00
Quote Anchor link
Quote:
Aan data alleen heb je niets; het wordt pas informatie als je het ergens voor gebruikt. De hamvraag voor de TS is dus vooral: wat wil je weten?

Ik wil graag weten hoe een tijdelijke tabel werkt. Hoe kan ik deze aanmaken, hoe kan ik de huidige tabel kopiëren naar de tijdelijke. Meestal voeg ik er ook wel een datum aan toe, maar in dit geval gaat het mij vooral om hoe ik een tijdelijke tabel kan gebruiken. Gewoon nieuwsgierigheid dus.
In het eerste voorbeeld heb ik een verjaardagskalender die elke maand wordt bijgewerkt. Alle records worden op inactief gezet (1 naar 0) en wordt dan d.m.v. 'ON DUPLICATE KEY UPDATE' weer op 1 gezet of er wordt een nieuwe record toegevoegd. Het zou leuk zijn om te weten welke dan nieuw zijn, welke verwijdert zijn (blijven op 0, maar er zijn dus meer records die 0 zijn, dus moet alleen de laatste hebben) en welke zijn geüpdatet.
Hoe zie ik het verschil of alleen het veld 'active' is geüpdatet of dat er ook andere velden zijn geüpdatet?

Een tweede voorbeeld zou kunnen zijn; Ik gebruik veel arrays en soms wordt het best lastig om al deze arrays nog aan elkaar te koppelen en te sorteren en te doorzoeken etc. Het zou dus ook wel een uitkomst zijn om de arrays in een tijdelijke tabel te gooien om deze makkelijker te kunnen presenteren?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.