sql >> Databasteknik >  >> RDS >> Mysql

DETERMINISTISK, INGEN SQL eller READS SQL DATA i dess deklaration och binär loggning är aktiverad

Det finns två sätt att fixa detta:

  1. Kör följande i MySQL-konsolen:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Lägg till följande till mysql.ini-konfigurationsfilen:

    log_bin_trust_function_creators = 1;

Inställningen lättar på kontrollen av icke-deterministiska funktioner. Icke-deterministiska funktioner är funktioner som modifierar data (d.v.s. har uppdatera, infoga eller ta bort uttalanden). För mer information, se här .

Observera att om binär loggning INTE är aktiverad, gäller inte denna inställning.

Binär loggning av lagrade program

log_bin_trust_function_creators

Det bästa tillvägagångssättet är en bättre förståelse och användning av deterministiska deklarationer för lagrade funktioner. Dessa deklarationer används av MySQL för att optimera replikeringen och det är bra att välja dem noggrant för att få en sund replikering.

DETERMINISTISK En rutin anses vara "deterministisk" om den alltid ger samma resultat för samma inmatningsparametrar och INTE DETERMINISTISK annars. Detta används oftast med sträng- eller matematisk bearbetning, men inte begränsat till det.

INTE DETERMINISTISK Motsatsen till "DETERMINISTIC"."Om varken DETERMINISTIC eller NOT DETERMINISTIC anges i rutindefinitionen är standardvärdet INTE DETERMINISTIC. För att förklara att en funktion är deterministisk måste du ange DETERMINISTIC explicit. ". Så det verkar som att om inget uttalande görs, kommer MySQl att behandla funktionen som "INTE DETERMINISTISK". Detta uttalande från manualen står i motsägelse till andra uttalanden från ett annat område av manualen som säger att:" När du skapar en lagrad funktion måste du deklarera antingen att den är deterministisk eller att den inte ändrar data. Annars kan det vara osäkert för dataåterställning eller replikering. Som standard, för att en CREATE FUNCTION-sats ska accepteras, måste minst en av DETERMINISTIC, NO SQL eller READS SQL DATA anges uttryckligen. Annars uppstår ett fel "

Jag fick personligen fel i MySQL 5.5 om det inte finns någon deklaration, så jag lägger alltid in minst en deklaration av "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" eller "READS SQL DATA" oavsett andra deklarationer jag kan ha.

LÄSER SQL-DATA Detta säger uttryckligen till MySQL att funktionen ENDAST kommer att läsa data från databaser, så att den inte innehåller instruktioner som ändrar data, men den innehåller SQL-instruktioner som läser data (t.ex. SELECT).

ÄNDRINGAR SQL-DATA Detta indikerar att rutinen innehåller satser som kan skriva data (till exempel innehåller den UPDATE, INSERT, DELETE eller ALTER instruktioner).

INGEN SQL Detta indikerar att rutinen inte innehåller några SQL-satser.

INNEHÅLLER SQL Detta indikerar att rutinen innehåller SQL-instruktioner, men inte innehåller satser som läser eller skriver data. Detta är standard om ingen av dessa egenskaper anges explicit. Exempel på sådana uttalanden är SELECT NOW(), SELECT [email protected] , SET @x =1 eller DO RELEASE_LOCK('abc'), som exekverar men varken läser eller skriver data.

Observera att det finns MySQL-funktioner som inte är deterministiskt säkra, såsom:NOW(), UUID(), etc, som sannolikt ger olika resultat på olika maskiner, så en användarfunktion som innehåller sådana instruktioner måste deklareras som INTE DETERMINISTISK .Dessutom är en funktion som läser data från ett oreplikerat schema uppenbarligen INTE BESTÄMMANDE.*



  1. Olika sätt att övervaka SQL Server AlwaysOn-tillgänglighetsgrupper

  2. mysql ordning efter, null först och DESC efter

  3. Access dataverse-anslutningen är nu tillgänglig att testa

  4. Hur använder man ett ALIAS i en PostgreSQL ORDER BY-klausul?