Jak na triggery – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak na triggery – MySQL – Fórum – Programujte.comJak na triggery – MySQL – Fórum – Programujte.com

 

fix0
Stálý člen
28. 1. 2019   #1
-
0
-

Ahoj, prosím o radu, někoho zkušenějšího.

Potřebuji, aby databáze sama prováděla určité operace nad INSERTOVANÝMI daty.

K tomuto účelu by se mělo dát používat v MySQL nějakých rutin, které se nazývaji "triggery".

Jen mě moc nenapadá, jak bych vytvořil skript rutin tak, aby to fungovalo jak má. Jsou tam nějaké DELIMITERY$$ což vůbec nechápu k čemu slouží. Zkrátka, kdyby se někdo nudil  chtělo by se mu mi ukázat, jak by se řešily následující příklady, budu rád.

1. Příklad: Když do databáze chci nahrát např: "petr;;;novak;;;736756951;;;praha", tak aby se ty data roztřídily do příslušných sloupců. Třeba s využitím nějakého dočasného sloupce, např, to pro začátek před roztříděním nahrát do poje jméno. Navrhněte případně jiné řešení.

2. Příklad: Nad už roztříděnou databází chci provést další rutinu a to takovou, že mám seznam telefonních čísel. Rutina se podívá na všechny nově přidané záznamy (např. pokud sloupeček new je roven 1), a ty zkontroluje, pokud kontakt obsahuje číslo, které je uvedeno v seznamu, tak mu nastaví sloupeček na hodnotu 1, jakože to čísle obsahuje to pole.

3. Příklad: Rutina, která zajistí, aby se do databáze nedal přidat záznam, který obsahuje telefonní číslo v databázi již existující.

Díky moc za vyřešení křížovky.

Nahlásit jako SPAM
IP: 89.24.217.–
28. 1. 2019   #2
-
+1
-
Zajímavé
fix +

Delimiter je standartně ; - slouží k ukončení příkazu. Jestliže píšu tělo rutiny, musím tedy nastavit jiný delimiter, aby po dobu psaní těla rutiny nebyl středník považován za ukončení příkazu CREATE ... To se pak dělá pomocí DELIMITER $$, pak se po napsání rutiny zase vrátí delimiter na původní hodnotu. Samozřejmě lze použít i jiný znak nebo sekvenci znaků, u kterých je pravděpodobné, že se v těle rutiny nevyskytnou. Tento postup se používá nejen u triggerů, ale i u procedur a UDF.

1. rozparsovat řetězec na data do sloupců bych dělal na straně aplikace, která data vkládá. Současně bych si zajistil kontrolu dat. Vožení jakéhokoliv řetězce přináší riziko Script Injection.

2. Předpokládám, že telefonní seznam je další tabulka v databázi. Pak by mohl stačit buď dotaz s poddotazem nebo spojení tabulek.

3. aby nešlo přidat již existující číslo - zde by šlo použít trigger before insert, ale jednodušší je nastavit sloupec jako unikátní. Vkládání duplicitního obsahu pak skončí chybou.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
28. 1. 2019   #3
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
fix0
Stálý člen
28. 1. 2019   #4
-
0
-

#2 hlucheucho

1. V původním řešení jsem měl aplikaci s proprietárním kódem, kde nebylo možné parsovat na straně aplikace, ale nově jsem to vyřešil vlastní aplikací, takže vlastně proč ne. VYŘEŠENO DĚKUJI MOC.

2. Neumím si to v praxi představit, ale vlastně to jde řešit také uplně v pohodě už na straně aplikace, ve skriptu, který bude záznamy přidávat. VYŘEŠENO DĚKUJI MOC.

3. Unikátní sloupec není možný, nebude to unikátní podle konkrétního sloupce, ale spíš podle konkrétní kombinace sloupců. Jakože telefonní číslo, ale v určité kategorii uživatelů navíc registrovaných v konkrétním dni, třeba. Zkusím se s tím tedy nějak popasovat a najít si nějaké trigger příklady. Děkuji

Nahlásit jako SPAM
IP: 89.24.217.–
Kit+15
Guru
28. 1. 2019   #5
-
0
-

#2 hlucheucho
Osvědčil se mi 

DELIMITER ;;

u kterého vím, že  mi s ničím kolidovat nebude. Obvykle ho ani nevracím zpět a nechávám si ho do konce seance.

Nahlásit jako SPAM
IP: 194.228.20.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
28. 1. 2019   #6
-
0
-

#4 fix
Na kombinaci se dá použít "autogenerated column" a ten nastavit jako unikátní. Pak se bude do takového sloupce zapisovat kombinace dat z vybraných sloupců. Akorát musíš mít novější verzi MySQL. Hledej v dokumentaci od které verze je to podporováno. Pak ještě trigger.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý