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.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.