Adatbázis: SQL, XML DB

MySQL TRIGGER OLD/NEW

Helló!

Van két táblám. Egyszerűség kedvéért

stock(id,stock,NOW()) 
trans(id,product_id,mennyiseg);

Azt szeretném, ha bármilyen SQL művelet van a trans táblán, akkor annak utolsó rekordjának az egyik mezeje alapján a stock táblába menjen egy REPLACE ahol eltárolom a termékhez tartozó aktuális készletet. Valamiért a NEW és az OLD rohadtul nem adódik át.
Mit rontok el?

 


CREATE TRIGGER trans_update
    AFTER UPDATE ON trans
    FOR EACH ROW 
    REPLACE INTO stock SET stock = (SELECT SUM(mennyiseg) as mennyiseg FROM trans WHERE product_id = 'OLD.product_id'), id = 'OLD.product_id';

CREATE TRIGGER trans_insert
    AFTER INSERT ON trans
    FOR EACH ROW 
    REPLACE INTO stock SET stock = (SELECT SUM(mennyiseg) as mennyiseg FROM trans WHERE product_id = 'NEW.product_id'), id = 'NEW.product_id';

    
CREATE TRIGGER trans_delete
    AFTER DELETE ON trans
    FOR EACH ROW 
    REPLACE INTO stock SET stock = (SELECT SUM(mennyiseg) as mennyiseg FROM trans WHERE product_id = 'OLD.product_id'), id = 'OLD.product_id';

Adatfeldolgozás segítség kérése

Van egy nyilvántartó program, amiből naponta kétszer töltök le egy-egy excel fájlt, a két időpont között új sorok keletkeznek a táblázatban az új sorok egy része már szerepel az előző táblázatban, csak bizonyos cellák tartalma változik, míg más sorok teljesen újak.

A feladat az, hogy meg kell nézni, hogy az előző állapothoz képest mennyi az olyan új sor ami még egyáltalán nem szerepel. Az eredmény egy szám hogy mennyi az új sor.

Az új sorokat hozzá kellene fűzni az előző táblázathoz, így az első táblázat folyamatosa bővülne.

A rendelkezésre álló szoftverek MS Office Excel és Access 2007.

Amit szeretnék, hogy az excel fájt megetetem az access-el, megcsináltatom az összehasonlítást és kapok egy számot, valamint egyéb lekérdezéseket is lefuttatok aminek az eredményéből grafikont készítettetek.

Mindezt úgy kellene megvalósítani, hogy egy adott könyvtárba bemásolva az új fájt és elindítva az access adatbázis fájt, automatikusan  felismerné, hogy van új fájl abból kiszedné az új sorokat és törölné, majd elvégezné az egyéb lekérdezéseket és frissítené a grafikonokat.

A gépen Windows 10 van, a szoftverek fixek, nem tudok telepíteni, esetleg ha van olyan ingyenes szoftver amivel a fenti dolog könnyebben megvalósítható rábírható a vezető, hogy telepítésre kerüljön.

Az access-ban az összehasonlítást meg tudom csinálni, meg a lekérdezéseket is le tudom futtatni, de mindezt úgy kellene megoldani, hogy ha én nem vagyok a kollégák is meg tudják csinálni.

HANA + AMD

Hala,

Váltanánk a sokéves vasunkról. Újabb SuSE Entrerprise Server + zsírúj HAHA is érkezik belátható időn belül, ezek miatt (is) felmerült, hogy vegyek új szervert. Egy AMD Epyc alapú HP szerver 1T -1.5T memóriával és 10x1.92T SSD-vel lenne a legvonzóbb, de nincs tapasztalatom AMD Zen szerverplatformon.

Kérdésem: fut valakinél memóriában ülő HANA kiszolgáló AMD vason? Milyen tapasztalatok vannak vele? Személyes tapasztalatokat kutatok, nem a google érdekel. Ha elköltök nettó 10+ miskát és valami nem úgy sül el ahogyan kellene, azért keresztre feszítenek - mármint engem :) ez ellen keresek valami mankót. Ha nem nyert az ötletem az is ok, úgy megyek tovább Intel vonalon.

Nagyon köszönöm!

 

MySQL: Először szűrni és az eredményt JOIN-olni, howto?

Van egy főtábla (`employees`):

emp_no	int(11)	
birth_date	date	
first_name	varchar(14)	
last_name	varchar(16)	
gender	enum('M','F')	
hire_date	date

Egy segédtábla (`titles`):

emp_no	int(11)	
title	varchar(50)	
from_date	date	
to_date	date NULL	

És egy másik segédtábla (`salaries`):

emp_no	int(11)	
salary	int(11)	
from_date	date	
to_date	date	

Mind a két segédtáblában foreign key az `emp_no`. A szűrés és lekérdezés megy így is:

SELECT `employees`.*, `titles`.`title`, `salaries`.`salary`
FROM `employees`
LEFT JOIN `titles` ON
	(`titles`.`emp_no` = `employees`.`emp_no`) AND
	(`titles`.`from_date` = (SELECT MAX(`from_date`) FROM `titles` WHERE `titles`.`emp_no` = `employees`.`emp_no`))
LEFT JOIN `salaries` ON
	(`salaries`.`emp_no` = `employees`.`emp_no`) AND
	(`salaries`.`from_date` = (SELECT MAX(`from_date`) FROM `salaries` WHERE `salaries`.`emp_no` = `employees`.`emp_no`))
WHERE (`titles`.`title`='Staff') AND (`salaries`.`salary`>='120000')
LIMIT 0, 20

De ez így nagyon lassú, 4-5 másodperceket kotorászik, pedig alig hárommillió rekord van a `salaries`-ben, négyszázezer a `titles`-ben és háromszázezer az `employees`-ben. (Ha pedig még sorrendezés is kerül bele, akkor aztán több, mint 10 másodperc...)

Próbáltam így is

SELECT `employees`.*, `titles`.`title`, `salaries`.`salary`
FROM `employees`
LEFT JOIN `titles` ON
	(`titles`.`emp_no` = `employees`.`emp_no`) AND
	(`titles`.`from_date` = (SELECT MAX(`from_date`) FROM `titles` WHERE `titles`.`emp_no` = `employees`.`emp_no`))
LEFT JOIN `salaries` ON
	(`salaries`.`emp_no` = `employees`.`emp_no`) AND
	(`salaries`.`from_date` = (SELECT MAX(`from_date`) FROM `salaries` WHERE `salaries`.`emp_no` = `employees`.`emp_no`))
WHERE `employees`.`emp_no` IN
(
	SELECT `ut`.`emp_no` FROM
	(
		(SELECT `titles`.`emp_no` FROM `titles` WHERE `titles`.`title`='Staff')
		UNION
		(SELECT `salaries`.`emp_no` FROM `salaries` WHERE `salaries`.`salary`>='100000')
	) `ut`
)
LIMIT 0, 20

viszont így nem jó a végeredmény, rossz értékek jelennek meg a szűrt oszlopokban. Próbáltam úgy is, hogy először megszűröm az eredményt és aztán JOIN-olok

SELECT `employees`.*, `titles`.`title`, `salaries`.`salary` FROM
(
	SELECT * FROM `employees`
	WHERE `employees`.`emp_no` IN
	(
		SELECT `ut`.`emp_no` FROM
		(
			(SELECT `titles`.`emp_no` FROM `titles` WHERE `titles`.`title`='Staff')
			UNION
			(SELECT `salaries`.`emp_no` FROM `salaries` WHERE `salaries`.`salary`>='100000')
		) `ut`
	)
) AS `employees`
LEFT JOIN `titles` ON
	(`titles`.`emp_no` = `employees`.`emp_no`) AND
	(`titles`.`from_date` = (SELECT MAX(`from_date`) FROM `titles` WHERE `titles`.`emp_no` = `employees`.`emp_no`))
LEFT JOIN `salaries` ON
	(`salaries`.`emp_no` = `employees`.`emp_no`) AND
	(`salaries`.`from_date` = (SELECT MAX(`from_date`) FROM `salaries` WHERE `salaries`.`emp_no` = `employees`.`emp_no`))
LIMIT 0, 20

de dettó rossz adatok jöttek ki.

Sajnos már vagy 8-10 év óta nem foglalkoztam SQL-lel a sima SELECT/INSERT/UPDATE/DELETE szinten túl, így keresni is hiába kerestem, mert igazából nem tudom, hogy mit keressek.
Hogyan lehet ezt tisztességesen megcsinálni, hogy előbb leválogatja a két segédtáblából azokat a sorokat, amik érintettek és csak azokat kérje le a főtáblából, amik csatolhatóak?

LibreOffice base kérdés

Halihó!

Vannak adataim különböző forrásokból, és szeretném ezeket egyben kezelni. Arra számítottam, hogy majd a Libreoffice base, ami amúgy is telepítve van, tudja mindazt, ami nekem kell. Sosem használtam korábban, szóval simán lehet, hogy tévedek. Mindenesetre a Google nem segített eleget, és nem tudom hogy azért-e mert nem lehet ilyesmit, vagy csak rosszul kerestem.

Leírom, mire van szükségem:

Vannak csv fájljaim (és html is, de abból tudok egyszerűen csv-t konvertálni Libreoffice Calc-kal). Ezekben mind hasonló adatok vannak, de simán lehet, hogy eltérő sorrendben, formázással. Gondoljatok számlatörténetekre, különböző bankoknál vezetett néhány számla esetén. 3-4 csv már nem fog változni, mert az adott számla már megszűnt, 2-3 viszont még él, ezek időnként frissülhetnek (amikor kézzel új exportot készítek).

Azt megtaláltam, hogy a LO base tudja azt csinálni, hogy megadom, hogy létező adatokkal dolgozzék, text, kiválasztom a könyvtárat, és minden csv egy táblaként megjelenik. Ha új csv-t adok hozzá, a program újraindítása után az is megjelenik, szóval azt feltételezem, hogy a változásokat le tudja majd kezelni. Ez első lépésnek jó lehetne, de nem látom, hogyan tovább.

Úgy gondolom, hogy második lépésként minden táblához egy-egy view-t kellene deklarálnom, ami a különböző pozícióban lévő oszlopokat és a különböző módon formázott adatokat közös módon jelenítené meg. Nem látom, hogyan tudok View-t létrehozni.

Harmadik lépésként létrehoznék saját táblákat, amikbe kézzel vinnék be mindenféle adatot. Ez se megy.

Negyedik lépésként jöhetnének a valódi SQL lekérdezések, amik aztán igény szerint a különböző azonos formátumú view-kból szednék ki az adatokat, illetve a saját táblákat is használhatnák, amihez kell.

Ötödik lépésként megjeleníteném az adatokat.

Azt látom, hogy ha nem úgy hozom létre az adatbázist, hogy létező adatok -> csv, hanem újat hozok létre és kiválasztom, hogy milyen adatbázist használjon, akkor tudok kézzel létrehozni táblát, tudok view-t definiálni, de nem látok módot arra, hogy a csv-ből az adatokat láttassam.

Szóval úgy tűnik, vagy az egyik felét, vagy a másik felét tudom megoldani az igényeimnek, együtt nem megy. Vagy benézek valamit?

influxdb - syslog-ng az Ip tartomány foghíjjasan tárlódik le az adatbázisban

Sziasztok!

Tanácsot kérnék, hogy miért csinál nekem ehez hasonló anomáliákat az influxdb. Egy komplett ip range-t szeretnék letárolni az influxdb-be, de a /16 tartomány 65k IP címe helyett csak 11k -t rak bele az adatbázisba, de azt is össze-vissza:

1598129767714 192.168.253.38 192.168..253.38
1598129767717 192.168.253.238 192.168.253.238
1598129767719 192.168.254.164 192.168.254.164
1598129767722 192.168.255.110 192.168.255.110

 

syslog-ng:

destination d_localiprange_db {
        http(
                url("http://127.0.0.1:8086/write?db=logs")
                persist-name("localiprange")
                method("POST")
                user_agent("syslog-ng")
                body("iprange,iprange=${iprange} iprange=\"${iprange}\" ${UNIXTIME}${MSEC}")

Egy külön fájlba kiírom azt a tartalmat ami az adatbázisba is bekerülne, de itt megvan minden IP.

 

Előre is köszönöm a segítséget.

mysql replikáció csak bizonyos táblákra

Sziasztok!

Adott 2 mysql adatbázis ugyan azzal a struktúrával. Megoldható-e az, hogy kijelölve az egyiket master példánynak, bizonyos táblák replikálódjanak a slave példányba. Természetesen az adatbázist író alkalmazás oldalon garantálva lesz hogy ezek a bizonyos táblák csak az egyik alkalmazásból lesznek írva. 

[ Megoldva] MariaDB corruption

Sziasztok,

 

Egy áramszünet után a Raspberry Pi-ra (Raspbian / Stretch) telepített MariaDB nem akar elindulni (Nextcloudhoz van (volt...) használva). A file-rendszer ext4 - ami elvileg naplózó, de valahogy mégis megsérültek a dolgok (nem értek hozzá, gondolom az adatbázis file-ok lehetnek inkonzisztensek akkor is, ha maguk a file-ok a file-rendszerben nem serültek)

Próbáltam több dolgot, első körben leállítottam meg elindítottam a service-t, meg újraindítottam az gépet, keresgéltem Google-lel, nem találtam megoldást.

Az egész adatbázist (/var/lib/mysql/*) átraktam PC-re (Debian / Stretch), ott is ugyanaz történik.

Itt van a log.

Vissza lehet ezt még hozni vagy újra kell csinálnom az adatbázist a Nextcloud alá?

Van valakinek ötlete, hogy mit lenne még érdemes megpróbálni mielőtt újratelepítem?

 

Köszi

 

Sok probálkozás és file másolgatás után (már nem emlékszem, hogy melyik file-ok lettek végül felülírva, az ibdata1 illetve a nextcloud könyvtár biztosan az eredeti maradt) a megoldás az lett, hogy elindítottam egy "mysqld --innodb-force-recovery=5"-öt, amivel vegül nem abortált a szerver és csináltam egy dumpot a nextcloud adatbázisáról, majd töröltem mindent a /var/lib/mysql könyvtárból, utána pedig mysqld --initialize. Visszamásoltam a mysql könyvtárat (tehát /var/lib/mysql/mysql), csináltam egy nextcloud adatbázist és visszatöltöttem a dumpból az adatokat. Most működik a rendszer.

Excel tábláknál jobb és hatékonyabb adattárolás

Előszóként: adminisztrációban dolgozok, többnyire adatokkal (adatkezelés, feldolgozás, ellenőrzés, jelentéskészítés), de nem vagyok képzett informatikus, csak hozzáértő/lelkes amatőr, jó pár év gyakorlattal, mérnöki végzettséggel és gondolkodással.

Új munkakörbe kerültem és tisztességes adatbázisok helyett szivárványszínűre színezett excel-táblázatokkal találtam szemben magam, emailben érkező updatekkel, hálózati meghajtón tárolt összevissza elnevezett verziókkal, satöbbi. Ettől persze égnek áll a hajam... A kérdésem pedig az lenne, hogy mibe/hogyan tegyem át ezeket, hogy ne kapjak idegbajt már rövidtávon.

Az adat maga (egyelőre) nem túl sok: pár száz, max. 1-2 ezer sor, 30-40-50 oszloppal; ezek egy része számszerű érték, vagy egy (nagyjából) fix lista, de persze vannak szöveges kommentek is. A nehezítés inkább az, hogy ezeket (egy-egy részét) külső kontaktoknak elküldjük, akik kitöltve-frissítve visszaküldik nekünk, a fent említett színes-ömlesztett excel táblák formájában. Nyilván ezt a részét jó lenne valami olyan rendszerben kiküldeni-bekérni, hogy ne lehessen belőle nagy kuplerájt csinálni. Egy kolléga a kívülről is használható webes survey-rendszerünket használja/javasolja ahol valamennyire le lehet korlátozni, hogy mit írhassanak be, a bejövő válaszokat egyben lehet exportálni (gondolom excelbe), és így legalább az emaileket meg lehet spórolni. Sajnos nem vagyok meggyőződve, hogy ez nekünk is jó megoldás. Az egyéb belső rendszereket valószínűleg nem tudom megosztani a külső kontaktokkal.

De ha ez nem is megy, akkor legalább a belső nyilvántartásunkat áttenném valami használhatóbb formába. MS eszközök rendelkezésre állnak, de egyedi szoftvert nem fognak a kedvemért vásárolni. Akár komolyabb adatbázisokban is gondolkodhatok, bár mint feljebb írtam, nem az adat mennyisége a probléma, inkább a kezelése (illetve kezelhetetlensége). És persze az is jó lenne, ha a munkatársaim is tudnák legalább alapszinten használni (adatot bevinni-kivenni) ha épp nem vagyok ott, tehát egyszerű szűrés, export, (esetleg import) képességek jók volnának.

Erre szeretnék remek ötleteket kapni tőletek :-)

update: nem akarom megváltani a világot; nem akarom a külső felhasználókat átképezni; nem akarok felmondani. Köszi!

MySQL - Memcached ebben az esetben segithet?

Sziasztok!

 

Adott egy adatbazis, amin minden honapban egyszer egy brutal nagy query-t futtatnak. (idonyilvantarto rendszer, egy tobb ezres allomany blokkolasi adatait adja at a berszamfejtesre). A Lekerdezes van hogy egy oran at is tarthat. 

 

Az lenne a kerdesem, hogy egy Memcached beillesztese segithet szerintetek ezen a dolgon? Azt tudom, hogy alapvetoen minden Mysql performance/cache tuning arra van kihegyezve, hogy sok felhasznalot tudjon viszonylag kis lekerdezesekkel kiszolgalni egyszerre gyorsan, de ennel a rendszernel pont forditott a helyzet. Viszonylag keves felhasznalo hasznalja, Viszont nagyon nagy lekerdezesekkel.

 

Ha a Memcached nem jo erre, akkor esetleg van otletetek, mi az, amivel egy ilyen tipusu adatbazis teljesitenyet lehet novelni? (Most csak uzemeltetesi szempontbol kerdezem, magat a programot nem mi irtuk, tehat a program oldali opimalizalashoz nincs kozunk)