Existem duas maneiras de corrigir isso:
Execute o seguinte no console MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
Adicione o seguinte ao arquivo de configuração mysql.ini:
log_bin_trust_function_creators = 1;
A configuração relaxa a verificação de funções não determinísticas. Funções não determinísticas são funções que modificam dados (isto é, atualizar, inserir ou deletar instrução (ões)). Para mais informações, veja aqui .
Observe que, se o log binário NÃO estiver habilitado, esta configuração não se aplica.
Registro Binário de Programas Armazenados
Se o log binário não estiver habilitado, log_bin_trust_function_creators não se aplica.
log_bin_trust_function_creators
Esta variável se aplica quando o log binário está habilitado.
A melhor abordagem é um melhor entendimento e uso de declarações determinísticas para funções armazenadas. Essas declarações são usadas pelo MySQL para otimizar a replicação e é bom escolhê-las com cuidado para ter uma replicação saudável.
DETERMINISTICO
Uma rotina é considerada “determinística” se sempre produzir o mesmo resultado para os mesmos parâmetros de entrada e NÃO DETERMINÍSTICA caso contrário. Isso é usado principalmente com processamento de string ou matemático, mas não se limita a isso.
NÃO DETERMINISTICO
Oposto de "DETERMINISTAS". " Se nem DETERMINISTIC nem NOT DETERMINISTIC forem fornecidos na definição da rotina, o padrão é NOT DETERMINISTIC. Para declarar que uma função é determinística, você deve especificar DETERMINISTIC explicitamente. ". Portanto, parece que, se nenhuma declaração for feita, o MySQL tratará a função como "NÃO DETERMINISTICA". Esta declaração do manual está em contradição com outra declaração de outra área do manual que diz que: "Ao criar uma função armazenada, você deve declarar que ela é determinística ou que não modifica os dados. Caso contrário, pode não ser seguro para recuperação ou replicação de dados. Por padrão, para que uma instrução CREATE FUNCTION seja aceita, pelo menos um DETERMINISTIC, NO SQL ou READS SQL DATA deve ser especificado explicitamente. Caso contrário, ocorre um erro "
Eu pessoalmente recebi um erro no MySQL 5.5 se não houver nenhuma declaração, então eu sempre coloco pelo menos uma declaração de "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" ou "READS SQL DATA" independente de outras declarações que eu possa ter.
READS SQL DATA
Isto diz explicitamente ao MySQL que a função irá SOMENTE ler dados de bancos de dados, portanto, não contém instruções que modificam os dados, mas contém instruções SQL que lêem os dados (eq SELECT).
MODIFIES SQL DATA
Indica que a rotina contém instruções que podem escrever dados (por exemplo, contém instruções UPDATE, INSERT, DELETE ou ALTER).
NO SQL
Isso indica que a rotina não contém instruções SQL.
CONTAINS SQL
Isso indica que a rotina contém instruções SQL, mas não contém instruções que leem ou gravem dados. Este é o padrão se nenhuma dessas características for fornecida explicitamente. Exemplos de tais instruções são SELECT NOW (), SELECT 10 + @ b, SET @x = 1 ou DO RELEASE_LOCK ('abc'), que executam, mas não lêem nem gravam dados.
Observe que há funções do MySQL que não são deterministicamente seguras, como: NOW (), UUID (), etc, que provavelmente produzirão resultados diferentes em máquinas diferentes, portanto, uma função de usuário que contém tais instruções deve ser declarada como NOT DETERMINISTIC . Além disso, uma função que lê dados de um esquema não replicado é claramente NONDETERMINISTIC. *
A avaliação da natureza de uma rotina é baseada na “honestidade” do criador: o MySQL não verifica se uma rotina declarada DETERMINISTICA está livre de declarações que produzem resultados não determinísticos. No entanto, declarar incorretamente uma rotina pode afetar os resultados ou afetar o desempenho. Declarar uma rotina não determinística como DETERMINISTIC pode levar a resultados inesperados, fazendo com que o otimizador faça escolhas incorretas de plano de execução. Declarar uma rotina determinística como NONDETERMINISTIC pode diminuir o desempenho, fazendo com que as otimizações disponíveis não sejam usadas.