Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

DETERMINISTIC, NO SQL ou READS SQL DATA em sua declaração e o log binário está habilitado


Existem duas maneiras de corrigir isso:

  1. Execute o seguinte no console do MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. 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 (ou seja, possuem instruções de atualização, inserção ou exclusão). Para obter mais informações, consulte aqui .

Observe que, se o log binário NÃO estiver ativado, essa configuração não se aplica.

Registro binário de programas armazenados

log_bin_trust_function_creators

A melhor abordagem é uma melhor compreensão 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.

DETERMINISTA Uma rotina é considerada “determinística” se sempre produz o mesmo resultado para os mesmos parâmetros de entrada e NÃO DETERMINISTA caso contrário. Isso é usado principalmente com processamento de string ou matemática, mas não limitado a isso.

NÃO DETERMINISTA Oposto de "DETERMINISTIC".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. ". Parece que se nenhuma declaração for feita, o MySQl tratará a função como "NÃO DETERMINISTA". Esta declaração do manual está em contradição com outra declaração de outra área do manual que diz que:" Quando você cria um 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 de DETERMINISTIC, NO SQL ou READS SQL DATA deve ser especificado explicitamente. Caso contrário, ocorrerá um erro "

Pessoalmente, recebi erro no MySQL 5.5 se não houver declaração, então sempre coloco pelo menos uma declaração de "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" ou "READS SQL DATA" independentemente de outras declarações que eu possa ter.

LÊ DADOS SQL Isso diz explicitamente ao MySQL que a função APENAS lerá dados de bancos de dados, portanto, não contém instruções que modificam dados, mas contém instruções SQL que lêem dados (por exemplo, SELECT).

MODIFICA DADOS SQL Isso indica que a rotina contém instruções que podem gravar dados (por exemplo, contém instruções UPDATE, INSERT, DELETE ou ALTER).

SEM SQL Isso indica que a rotina não contém instruções SQL.

CONTÉM SQL Isso indica que a rotina contém instruções SQL, mas não contém instruções que lêem ou gravam dados. Este é o padrão se nenhuma dessas características for fornecida explicitamente. Exemplos de tais declarações são SELECT NOW(), SELECT [email protected] , SET @x =1 ou DO RELEASE_LOCK('abc'), que executam, mas não lêem nem gravam dados.

Observe que existem funções MySQL que não são seguras determinísticas, como:NOW(), UUID(), etc, que provavelmente produzirão resultados diferentes em máquinas diferentes, portanto, uma função de usuário que contenha 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 NÃO DETERMINISTA.*