Adatbázis: SQL, XML DB

mysql store function probléma

Munkám során egy problémába ütköztem, aminek több fórumon utánnanézve sem találtam meg a megoldását. Remélem ti tudtok segíteni.

Adott egy MySQL 5.0.27 szerver melyben a következők:
Egy tábla:

CREATE TABLE `parts` (
`main_item_id` int(5) unsigned NOT NULL,
`part_item_id` int(5) unsigned NOT NULL,
) ENGINE=InnoDB

Az összekapcsolás azt határozza meg, hogy a part_item_id része a main_item_id-nak.

A probléma az, hogy ellenőriznem kell hogy egy áru ne lehessen önmaga része. Azaz ha egy gráfként képzelem el, akkor ne lehessen benne kör.

Ezt mysql function-ként szerettem volna megírni, de mindig azt a hibaüzenetet kaptam, hogy nem lehet recursive store function-t írni. Ezen teljesen kiakadva megírtam procedure-ként. Azt viszont nem lehet betenni select where részébe. Próbáltam a function atver() { call procedure;} kombinációt is, de ugyan azt a hibát kaptam.
Utánnanéztem a 'store function' definíciónak is, de hiába próbálkoztam, nem tudtam anélkül megoldani. A procedure és a function kódját bemásolom, hátha van itt valaki aki nem az első ilyet írja, és tudna segíteni benne.

Még annyit, hogy szeretném használni select * from items where iscorrectparttable(item_id,item_parent_id) = 1; formában, vagy ehhez hasonlóan. Tehát, hogy le tudjam kérdezni azokat az elemeket amik lehetnek egy elem részei anélkül hogy kör lenne a gráfban.

Remélem érthető voltam. Nagyon próbálkoztam...

Tehát a függvények:

az eredeti procedure

MAIN_BLOCK: BEGIN

DECLARE nincstalalat INT DEFAULT 0;

DECLARE itemid SMALLINT(5);

DECLARE items CURSOR FOR SELECT part_item_id FROM item_parts WHERE main_item_id=root;

DECLARE bejar CURSOR FOR SELECT item FROM bejart WHERE item = root;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET nincstalalat=1;

IF level = 0 THEN

SET max_sp_recursion_depth=15;

DROP TABLE IF EXISTS bejart;

CREATE TABLE IF NOT EXISTS bejart(

item SMALLINT(5) PRIMARY KEY

) ENGINE=HEAP;

INSERT INTO bejart VALUES(parent);

END IF;

OPEN bejar;

FETCH bejar INTO itemid;

IF nincstalalat = 1 THEN

INSERT INTO bejart VALUES (root);

ELSE

SET result = 0;

LEAVE MAIN_BLOCK;

END IF;

CLOSE bejar;

SET nincstalalat=0;

OPEN items;

fetch_loop:

LOOP

FETCH items INTO itemid;

IF nincstalalat = 1 THEN

LEAVE fetch_loop;

ELSE

CALL isCorrectPartTable(itemid,level+1,parent,result);

if result = 0 then leave main_block; end if;

END IF;

END LOOP fetch_loop;

CLOSE items;

IF level = 0 THEN DROP TABLE bejart;

IF ISNULL(result) THEN set result = 1; end if;

END IF;

END MAIN_BLOCK$$

.
.
.
.
.
.
.
azt hittem, hogy sikerül majd nem store function-t írnom, de eddig nem sikerült
.
.

MAIN_BLOCK: BEGIN

DECLARE vantalalat BOOL;

DECLARE itemid SMALLINT(5);

DECLARE temp VARCHAR(255);

DECLARE items CURSOR FOR SELECT part_item_id FROM item_parts WHERE main_item_id=item;

DECLARE bejar CURSOR FOR SELECT bejart REGEXP CONCAT('.*,',item,',.*');

DECLARE CONTINUE HANDLER FOR NOT FOUND SET vantalalat=0;

IF level = 0 THEN

SET max_sp_recursion_depth=15;

SET bejart=CONCAT(",",parent,",");

END IF;

SET vantalalat=1;

OPEN bejar;

FETCH bejar INTO vantalalat;

IF vantalalat = 0 THEN

SET bejart = CONCAT(bejart,item,',');

ELSE

RETURN '0';

END IF;

CLOSE bejar;

SET vantalalat=1;

OPEN items;

fetch_loop:

LOOP

FETCH items INTO itemid;

IF vantalalat = 0 THEN

LEAVE fetch_loop;

ELSE

SET temp = pina(item,itemid,level+1,bejart);

IF temp = '0' THEN

RETURN '0';

ELSE

SET bejart = temp;

END IF;

END IF;

END LOOP fetch_loop;

CLOSE items;

IF level = 0 THEN

RETURN '1';

ELSE RETURN bejart;

END IF;

END MAIN_BLOCK$$

SQL lekérdezés

A segítségeteket szeretném kérni egy sql lekérdezésben. (mysql DB)

termékkódok 1-99999 Arra lennék kíváncsi, hogy a lekérdezett hónapban milyen termékeket néztek meg, illetve egy-egy napon hányszor néztek meg egy terméket.

táblanév: "YYYYMM" (20090501)
mezők: DD (1-31)
tárolt adat: megtekintett termékkód

Köszönöm

Mysql-proxy read-only-backend probléma

Hello,

Mysql-proxy segítségével szerettem volna többek közt r/w loadbalancingot megoldani két sql szerver közt de sajnos nem sikerült , az alábbiakban részletesen vázolom mit próbáltam.
Adott két mysql szerver Master-Master replikációval (hívjuk őket sqlA és sqlB-nek). A szervereken sok DB található, és ezekhez csatlakozik több másik szerver. (hívjuk őket cliensA cliensB cliensC-nek....)
A kliensek mindegyikén található egy-egy mysql-proxy.

    mysql-proxy 0.7.2
    glib2: 2.16.6
    libevent: 1.3e
    lua: Lua 5.1.3
    LUA_PATH: /usr/lib/mysql-proxy/lua/?.lua
    LUA_CPATH: /usr/lib/mysql-proxy/lua/?.so
    == plugins ==
    admin: 0.7.0
    proxy: 0.7.0

A cél az lett volna, hogy a kliensek a proxy-n keresztül csatlakoznak az sql szerverekhez. Az sqlA szerveren írás-olvasás működne, az sqlB-n csak olvasási műveletek futnának.
Úgy gondoltam erre a mysql-proxy tökéletes megoldást biztosít a következő configgal:

    ENABLED="true"
    OPTIONS="--admin-address=:4041 --proxy-address=:3306 --proxy-backend-addresses=10.10.10.1:3306 --proxy-read-only-backend-addresses=10.10.10.1:3306 --proxy-read-only-backend-addresses=10.10.10.2:3306 --log-file=/var/log/mysql/mysql-proxy.log --log-level=debug"

Sajnos ez így életképtelen volt, nem volt hajlandó a két read-only beállítást figyelembe venni. Nem kevés keresgélés után kiegészítettem a fenti configot rw-splitting.lua scripttel. A neten fellelhető patchekkel és kiegészítésekkel felvértezve.

    ENABLED="true"
    OPTIONS="--admin-address=:4041 --proxy-address=:3306 --proxy-backend-addresses=10.10.10.1:3306 --proxy-read-only-backend-addresses=10.10.10.1:3306 --proxy-read-only-backend-addresses=10.10.10.2:3306 --proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/rw-splitting.lua --log-file=/var/log/mysql/mysql-proxy.log --log-level=debug"

Ekkor már az sqlB szerveren is történtek olvasási műveletek. De a kliens szervereken futó alkalmazások , nagyon akadozva működtek csak, legtöbbszőr elveszítették a kapcsolatot vagy egyáltalán nem is tudtak csatlakozni az sql szerverekhez.

A mysql-proxy jelenleg is működik úgy, hogy csak egy --proxy-backend-addresses van megadva semmi más, de ezzel pont a lényegít veszti el.
A kérdésem az lenne, hogy ezzel kapcsolatban van valakinek tapasztalata , vagy más ötlete javaslata, hogyan lehetne ezt megvalósítani.

Előre is köszi.
üdv

MySQL full text search szótöredékre

Sziasztok!

A fent említett megoldandó feladattal kínlódok már egy ideje. Teljes szóra keresve tökéletes eredményt kapok. A keresés akkor is eredményes, ha *-ot használok a keresett karakterlánc végén, és a megadott szótöredékkel kezdődik a string (pl.: vala* -> valaki, valami, valahol). Azonban - az előbbi példánál maradva az "ala" karakterláncra empty set-et kapok válaszul (2-re vettem vissza a ft_min_word_len változót).

A kérdésem az lenne, hogy létezik-e erre valamilyen megoldás? (Azon járatom az agyam, hogy ha a full text search nem talál semmit, a következő lépésben LIKE-kal még keresek egyet. Az tuti ad vissza eredményt..)

A segítséget előre is köszönöm!

tomykav

Firebird 2.1 64 biten és Windows Server 2008-on (?)

Üdvözlet a népeknek,

Az alábbi párosítással lenne egy kis gondunk. A számlázó programunk Firebird adatbázist használ és eddig csak 32 bites környezetben futott. Volt alatt szerverként Vista és Windows 2003 SBS. Ezeken "csodálatosan" megy. Van pár felhasználói függvény ami az UDF könyvtárban van .dll formában és eddig szépen lefutottak.

Új év, új szerver és a Windows 2008 alatt hiába rakunk fel 32 vagy 64 bites Firebird szervert ezek a "saját" függvények nem hajtódnak végre.

Ha valaki tudna lökést adni hogy simán a szakadékba zuhanjunk vagy felérjünk a csúcsra azt megköszönném ;-)

[megoldva] Text fájl indexelés + keresés benne

Sziasztok,

Kerestem neten és manualban olyan egyszerű parancsot, amelly le tudnék indexeltetni egy nagy szöveges fájlt (mail box fájl) majd gyorsan tudnék kerestetni szavakat benne.

Egy nagy mail fájlt kellene szűrnöm visszatérően sokszor. Ez grep-pel ugye nagyon lassú (kb. 10 perc egy grep eredménye :)

Itt találtam egy leírást egy megoldásról, csak ezt az lsearch parancsot nem találom sem neten, sem a Debian-os csomagok között.

Létezik vajon ilyen megoldás a Debian-os csomag között?
Köszi.

pg_hba.conf hianyzik

Debianra probaltam feltenni a Postgrest.
http://www.debianhelp.co.uk/postgresql.htm
Fel is rakta, de nem kerdezett semmit es
#su
#su postgres
#psql template1
utan
psql: could not connect to server

A linkelt oldal szerint az installalas kozben letrehoz 1 /etc/postgresql/postgresql.conf fajlt. Ilyen nekem nincs.
Es ezt se talalom: /etc/postgresql/pg_hba.conf

Mi lehet a hiba? Hogy tudom ujrainstallalni es hol tudnek a problemanak utanaolvasni?
A segitseget elore is koszonom!

[delete] trigger tévedhet?

Üdv.
van egy trigger ami azt teszi, hogy egy tábla értékét módosítja aszerint hogy egy másik táblába milyen értéket írunk.

Trigger:

update keszlet
set menny=menny-NEW.menny
where cikk_id=NEW.cikk_id and raktar_id=NEW.raktar_id

update keszlet
set menny=menny-NEW.menny+OLD.menny
where cikk_id=NEW.cikk_id and raktar_id=NEW.raktar_id

update keszlet
set menny=menny+OLD.menny
where cikk_id=OLD.cikk_id and raktar_id=OLD.raktar_id

Létezhet az, hogy a mennyiség eltér (elég sokkal) a kívánt értéktől?:
avagy nincs-e hiba a fenti triggerbe?

pch

[Megoldva] SELECT után eltérő eredmény phpMyAdminb-ban

Sziasztok!

Van egy táblám, amin ha a

SELECT *, CONCAT(REPEAT('1/', (CHAR_LENGTH(path) - CHAR_LENGTH(REPLACE(path, '/', '')))), ordering, '/') AS ordering_path FROM `categories` WHERE 1

kérést lefuttatom, parancssorban ezt kapom (ami a várt eredmény):

+----+----------+----------+---------------+
| id | path     | ordering | ordering_path |
+----+----------+----------+---------------+
| 33 | 0/18/30/ |        1 | 1/1/1/1/      | 
| 32 | 0/29/    |        1 | 1/1/1/        | 
| 31 | 0/18/    |        2 | 1/1/2/        | 
| 18 | 0/       |        2 | 1/2/          | 
| 29 | 0/       |        3 | 1/3/          | 
| 30 | 0/18/    |        1 | 1/1/1/        | 
+----+----------+----------+---------------+

Ellentétben phpMyAdminnal, amelyben ugyanezt a kérést lefutattva az eredmény:

id	path		ordering	ordering_path
33	0/18/30/	1		[BLOB - 8B]
32	0/29/		1		[BLOB - 6B]
31	0/18/		2		[BLOB - 6B]
18	0/		2		[BLOB - 4B]
29	0/		3		[BLOB - 4B]
30	0/18/		1		[BLOB - 6B]

Miért ad phpMyAdmin más eredményt?

A tábla szerkezete a következő:

+--------------------+---------------------+------+-----+---------+----------------+
| Field              | Type                | Null | Key | Default | Extra          |
+--------------------+---------------------+------+-----+---------+----------------+
| id                 | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment | 
| path               | varchar(127)        | NO   |     |         |                | 
| ordering           | bigint(20) unsigned | NO   |     | 0       |                | 
+--------------------+---------------------+------+-----+---------+----------------+

Előre is köszönöm az ötleteket!