sql >> Database teknologi >  >> RDS >> Mysql

DETERMINISTISK, INGEN SQL eller LÆSER SQL DATA i dens erklæring, og binær logning er aktiveret

Der er to måder at løse dette på:

  1. Udfør følgende i MySQL-konsollen:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Tilføj følgende til mysql.ini-konfigurationsfilen:

    log_bin_trust_function_creators = 1;

Indstillingen aflaster kontrollen for ikke-deterministiske funktioner. Ikke-deterministiske funktioner er funktioner, der ændrer data (dvs. har opdatering, indsæt eller slet sætning(er)). For mere information, se her .

Bemærk venligst, at hvis binær logning IKKE er aktiveret, gælder denne indstilling ikke.

Binær logning af lagrede programmer

log_bin_trust_function_creators

Den bedste tilgang er en bedre forståelse og brug af deterministiske erklæringer for lagrede funktioner. Disse erklæringer bruges af MySQL til at optimere replikationen, og det er en god ting at vælge dem omhyggeligt for at få en sund replikation.

DETERMINISTISK En rutine betragtes som "deterministisk", hvis den altid producerer det samme resultat for de samme inputparametre og IKKE DETERMINISTISK ellers. Dette bruges for det meste med streng- eller matematisk behandling, men ikke begrænset til det.

IKKE DETERMINISTISK Modsat "DETERMINISTISK"."Hvis hverken DETERMINISTISK eller IKKE DETERMINISTISK er angivet i rutinedefinitionen, er standarden IKKE DETERMINISTISK. For at erklære, at en funktion er deterministisk, skal du udtrykkeligt angive DETERMINISTISK. ".Så det ser ud til, at hvis der ikke kommer nogen erklæring, vil MySQl behandle funktionen som "IKKE DETERMINISTISK". Denne erklæring fra manualen er i modstrid med andre erklæringer fra et andet område af manualen, som fortæller at:" Når du opretter en gemt funktion, skal du erklære enten, at den er deterministisk, eller at den ikke ændrer data. Ellers kan det være usikkert for datagendannelse eller replikering. Som standard, for at en CREATE FUNCTION-sætning kan accepteres, skal mindst én af DETERMINISTIC, NO SQL eller READS SQL DATA specificeres eksplicit. Ellers opstår der en fejl "

Jeg fik personligt fejl i MySQL 5.5, hvis der ikke er nogen erklæring, så jeg sætter altid mindst én erklæring af "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" eller "READS SQL DATA" uanset andre erklæringer, jeg måtte have.

LÆSER SQL-DATA Dette fortæller eksplicit til MySQL, at funktionen KUN vil læse data fra databaser, så den indeholder ikke instruktioner, der ændrer data, men den indeholder SQL-instruktioner, der læser data (f.eks. SELECT).

ÆNDRINGER SQL-DATA Dette indikerer, at rutinen indeholder sætninger, der kan skrive data (f.eks. indeholder den UPDATE, INSERT, DELETE eller ALTER instruktioner).

INGEN SQL Dette indikerer, at rutinen ikke indeholder SQL-sætninger.

INDEHOLDER SQL Dette indikerer, at rutinen indeholder SQL-instruktioner, men ikke indeholder sætninger, der læser eller skriver data. Dette er standard, hvis ingen af ​​disse karakteristika er angivet eksplicit. Eksempler på sådanne udsagn er SELECT NOW(), SELECT [email protected] , SET @x =1 eller DO RELEASE_LOCK('abc'), som udfører, men hverken læser eller skriver data.

Bemærk, at der er MySQL-funktioner, der ikke er deterministisk sikre, såsom:NU(), UUID() osv., som sandsynligvis vil producere forskellige resultater på forskellige maskiner, så en brugerfunktion, der indeholder sådanne instruktioner, skal erklæres som IKKE DETERMINISTISK .En funktion, der læser data fra et ikke-replikeret skema, er også klart IKKE-BESTEMMET.*



  1. 500 intern serverfejl?

  2. Bedste praksis for at oprette indekser på dine MySQL-tabeller – Rullende indeksbygninger

  3. SQL Server 2017 Trin for trin installation -2

  4. Oracle Database TLS1.2 / SSL-forbindelse ved hjælp af JDBC tynd og JKS