Nuestra base de datos tiene una función para generar un número de orden. Lee un valor de una tabla de Configuraciones, lo incrementa y luego devuelve el nuevo valor. Por ejemplo:CREAR error de FUNCIÓN "Esta función no tiene DETERMINISTIC, NO SQL o READS SQL DATA"
CREATE FUNCTION NextOrderNumber() RETURNS INTEGER UNSIGNED NOT DETERMINISTIC
BEGIN
DECLARE number INTEGER UNSIGNED;
UPDATE Settings SET IntegerValue=LAST_INSERT_ID(IntegerValue+1) WHERE KeyName='NextOrderNumber';
SET number=LAST_INSERT_ID();
return number;
END
Nota: No critique esta función Sé que tiene defectos, es sólo para ilustración.
podemos usar esta función como sigue:
INSERT INTO Orders(OrderNumber, ...)
SELECT NextOrderNumber(), ...
Cuando está habilitado el registro binario, CREATE FUNCTION da este error:
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)
Independientemente de lo binlog_format está establecido, es en realidad un problema con la función anterior? De acuerdo con mi lectura del relevante MySQL page, no puedo ver ninguna razón por la cual esta función sea incompatible con la replicación, con ROW o STATEMENT nivel de registro binario.
Si la función es segura, establecer el log_bin_trust_function_creators = 1 global me inquieta. No quiero deshabilitar esta comprobación para todas las funciones, solo esta. ¿Podría simplemente marcar la función como NO SQL para suprimir la advertencia? Lo intenté y funcionó. ¿Esto causará algún problema?
symcbean - Entiendo que este enfoque no funciona en un clúster. No estoy preguntando sobre ese escenario. Pregunto acerca de la configuración simple maestro-esclavo donde las inserciones/actualizaciones solo tienen lugar en un solo lugar. – richb