sql >> Base de Datos >  >> RDS >> Mysql

DETERMINISTIC, NO SQL o READS SQL DATA en su declaración y el registro binario está habilitado

Hay dos formas de arreglar esto:

  1. Ejecute lo siguiente en la consola de MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Agregue lo siguiente al archivo de configuración mysql.ini:

    log_bin_trust_function_creators = 1;

La configuración relaja la verificación de funciones no deterministas. Las funciones no deterministas son funciones que modifican datos (es decir, tienen declaraciones de actualización, inserción o eliminación). Para obtener más información, consulte aquí .

Tenga en cuenta que si el registro binario NO está habilitado, esta configuración no se aplica.

Registro binario de programas almacenados

log_bin_trust_function_creators

El mejor enfoque es una mejor comprensión y uso de declaraciones deterministas para funciones almacenadas. MySQL utiliza estas declaraciones para optimizar la replicación y es bueno elegirlas cuidadosamente para tener una replicación saludable.

DETERMINISTA Una rutina se considera "determinista" si siempre produce el mismo resultado para los mismos parámetros de entrada y NO DETERMINISTA de lo contrario. Esto se usa principalmente con cadenas o procesamiento matemático, pero no se limita a eso.

NO DETERMINISTA Opuesto a "DETERMINISTIC"."Si no se proporciona DETERMINISTIC ni NOT DETERMINISTIC en la definición de la rutina, el valor predeterminado es NOT DETERMINISTIC. Para declarar que una función es determinista, debe especificar DETERMINISTIC explícitamente. ".Así que parece que si no se hace ninguna declaración, MySQl tratará la función como "NO DETERMINISTA". Esta declaración del manual está en contradicción con otra declaración de otra área del manual que dice que:" Cuando creas un función almacenada, debe declarar que es determinista o que no modifica los datos. De lo contrario, puede que no sea seguro para la recuperación o replicación de datos. De forma predeterminada, para que se acepte una declaración CREATE FUNCTION, al menos uno de DETERMINISTIC, NO SQL o READS SQL DATA debe especificarse explícitamente. De lo contrario, se produce un error "

Personalmente, recibí un error en MySQL 5.5 si no hay una declaración, por lo que siempre pongo al menos una declaración de "DETERMINISTA", "NO DETERMINISTA", "NO SQL" o "LEE DATOS SQL", independientemente de otras declaraciones que pueda tener.

LEE DATOS SQL Esto le dice explícitamente a MySQL que la función SOLO leerá datos de bases de datos, por lo tanto, no contiene instrucciones que modifiquen datos, pero contiene instrucciones SQL que leen datos (por ejemplo, SELECCIONAR).

MODIFICA DATOS SQL Esto indica que la rutina contiene instrucciones que pueden escribir datos (por ejemplo, contiene instrucciones UPDATE, INSERT, DELETE o ALTER).

SIN SQL Esto indica que la rutina no contiene sentencias SQL.

CONTIENE SQL Esto indica que la rutina contiene instrucciones SQL, pero no sentencias que leen o escriben datos. Este es el valor predeterminado si ninguna de estas características se proporciona explícitamente. Ejemplos de declaraciones de este tipo son SELECT NOW(), SELECT [email protected] , SET @x =1 o DO RELEASE_LOCK('abc'), que se ejecutan pero no leen ni escriben datos.

Tenga en cuenta que hay funciones de MySQL que no son seguras deterministas, como:NOW(), UUID(), etc., que probablemente produzcan diferentes resultados en diferentes máquinas, por lo que una función de usuario que contenga tales instrucciones debe declararse como NO DETERMINISTA. .Además, una función que lee datos de un esquema no replicado es claramente NO DETERMINISTA.*