Diskuze: MySQL Deterministic funkce
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 9 zpráv z 9.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Funkce je buď standardní, anebo "DETERMINISTIC". Pokud obsahuje funkci NOW(), tak tam to klíčové slovo nedávej, bude nadefinována jako standardní, tedy nedeterministická.
V manuálu je doslova:
the default is NOT DETERMINISTIC
Jenže mě právě nejde vytvořit not deterministic funkce. Vypíše mi to Error Code: 1418. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)
Přidávám tu funkci, i když si myslím že v ní to nebude
DELIMITER //
CREATE FUNCTION dokonceniRegistrace(hashKod CHAR(32))
RETURNS VARCHAR(10)
BEGIN
DECLARE IDuzivatele INT;
SELECT userID INTO IDuzivatele FROM completeregister WHERE registerHack = hashKod;
IF userID IS NULL THEN RETURN 'Failure'; END IF;
DELETE FROM completeregister WHERE userID=IDuzivatele;
UPDATE users SET activated=1 WHERE id=IDuzivatele;
RETURN 'Success';
END//
Delimiter ;
Proč to děláš tak složitě? Vždyť to jde jedním dotazem
UPDATE users SET activated=1
WHERE id=IDuzivatele AND registerHack = hashKod;
Podle počtu ovlivněných záznamů (0 nebo 1) poznáš, zda se registrace povedla nebo ne.
Aha, ty to máš ve dvou tabulkách. Tak drobná oprava:
UPDATE users SET activated=1 WHERE id IN (
SELECT userID FROM completeregister WHERE registerHack = hashKod
);
Stejně si myslím, že by místo tabulky completeregister v
databázi měl být pouze záznam v SESSION.
No to je pravda, ale stále to neřeší problém u jiných funkcí, kde mi nejde vytvořit NOT DETERMINISTIC funkce. A poněvadž pokaždé generuji jiné MD5 z NOW() tak pokaždé funkce vrací jiný řetězec.
Tak výsledek funkce NOW() té své funkci předej přes DI jako
další parametr.
Jo, to je dobrý nápad, sice to není ideální, ale aspoň bude zaručen správnost výsledku. Jinak funkci mám z důvodu, že volám delete i update a nechci odesílat 2x požadavek.
Zobrazeno 9 zpráv z 9.