Tentei criar esta função no Amazon RDS for MySQL:
CREATE FUNCTION GetRootZoneId (zoneId INT) RETURNS INT READS SQL DATA
BEGIN
DECLARE _id, _parentId INT;
SELECT zoneId INTO _parentId;
my_loop: LOOP
SELECT id, parentId
INTO _id,_parentId
FROM Zone
WHERE id = _parentId;
IF _parentId IS NULL THEN
LEAVE my_loop;
END IF;
END LOOP my_loop;
RETURN _id;
END;
Isso só seria usado em uma consulta única para atualizar uma tabela de banco de dados existente.
Executá-lo me deu o seguinte erro:
ERRO 1419 (HY000): Você não tem o privilégio SUPER e o registro binário está ativado (você pode querer usar a variável menos segura log_bin_trust_function_creators)
Essa restrição também se aplica a procedimentos armazenados ou apenas a funções?
Se também se aplicar a procedimentos armazenados, existe alguma alternativa para executar um código equivalente sem definir log_bin_trust_function_creators=1
? Observe que sei como alterar essa configuração no RDS, gostaria apenas de evitar isso, se possível .
Você não pode evitá-lo. A restrição também se aplica a procedimentos armazenados. A única alternativa seria ter o privilégio SUPER, mas não acho que seja possível neste caso.
Além disso, você deve declarar sua função como
DETERMINISTIC
, informando explicitamente que não modificará os dados:Parece que isso não se aplica a procedimentos armazenados .
Reescrevi meu código para usar dois procedimentos para fazer o trabalho, em vez de uma instrução chamando uma função, e isso funciona bem.
A função acima foi reescrita para ser um procedimento:
E um segundo procedimento chama este para iterar nos registros a serem atualizados:
Executei com êxito este código no RDS com o
default.mysql5.6
grupo de parâmetros.