Mysql
 sql >> база данни >  >> RDS >> Mysql

ДЕТЕРМИНИСТИЧЕН, БЕЗ SQL или ЧЕТЕ SQL ДАННИ в своята декларация и двоичното регистриране е активирано

Има два начина да поправите това:

  1. Изпълнете следното в MySQL конзолата:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Добавете следното към конфигурационния файл mysql.ini:

    log_bin_trust_function_creators = 1;

Настройката облекчава проверката за недетерминирани функции. Недетерминираните функции са функции, които променят данни (т.е. имат израз(и) за актуализиране, вмъкване или изтриване). За повече информация вижте тук .

Моля, имайте предвид, че ако двоичното регистриране НЕ е активирано, тази настройка не се прилага.

Бинарно записване на съхранени програми

log_bin_trust_function_creators

Най-добрият подход е по-доброто разбиране и използване на детерминирани декларации за съхранени функции. Тези декларации се използват от MySQL за оптимизиране на репликацията и е добре да ги избирате внимателно, за да имате здрава репликация.

ДЕТЕРМИНИСТИЧЕН Подпрограмата се счита за „детерминистична“, ако винаги дава един и същ резултат за едни и същи входни параметри и НЕ ДЕТЕРМИНИСТИЧНА в противен случай. Това се използва предимно при обработка на низове или математика, но не се ограничава до това.

НЕ ДЕТЕРМИНИСТИЧНО Противоположно на „ДЕТЕРМИНИСТИЧЕН“.“Ако в дефиницията на рутинната програма не са дадени нито ДЕТЕРМИНИСТИЧЕН, нито НЕДЕТЕРМИНИСТИЧЕН, по подразбиране НЕ е ДЕТЕРМИНИСТИЧЕН. За да декларирате, че дадена функция е детерминистична, трябва да посочите ДЕТЕРМИНИСТИЧНО изрично. ".Така че изглежда, че ако не бъде направено изявление, MySQl ще третира функцията като "НЕ ДЕТЕРМИНИСТИЧНА". Това изявление от ръководството е в противоречие с друго изявление от друга област на ръководството, което казва, че:" Когато създадете запаметена функция, трябва да декларирате или че е детерминирана, или че не променя данните. В противен случай може да е опасно за възстановяване или репликация на данни. По подразбиране, за да бъде приет израз CREATE FUNCTION, трябва да бъде посочен изрично поне един от DETERMINISTIC, NO SQL или READS SQL DATA. В противен случай възниква грешка "

Аз лично получих грешка в MySQL 5.5, ако няма декларация, така че винаги слагам поне една декларация "ДЕТЕРМИНИСТИЧНО", "НЕ ДЕТЕРМИНИСТИЧНО", "НЯМА SQL" или "ЧЕТЕ SQL ДАННИ", независимо от други декларации, които може да имам.

ЧЕТЕ SQL ДАННИ Това изрично казва на MySQL, че функцията ще чете САМО данни от бази данни, следователно не съдържа инструкции, които променят данните, но съдържа SQL инструкции, които четат данни (напр. SELECT).

МОДИФИРА SQL ДАННИ Това показва, че рутината съдържа изрази, които могат да записват данни (например съдържа инструкции UPDATE, INSERT, DELETE или ALTER).

БЕЗ SQL Това показва, че рутината не съдържа SQL изрази.

СЪДЪРЖА SQL Това показва, че рутината съдържа SQL инструкции, но не съдържа изрази, които четат или записват данни. Това е по подразбиране, ако нито една от тези характеристики не е дадена изрично. Примери за такива изрази са SELECT NOW(), SELECT [email protected] , SET @x =1 или DO RELEASE_LOCK('abc'), които изпълняват, но нито четат, нито записват данни.

Имайте предвид, че има функции на MySQL, които не са детерминистично безопасни, като:NOW(), UUID() и т.н., които е вероятно да произведат различни резултати на различни машини, така че потребителска функция, която съдържа такива инструкции, трябва да бъде декларирана като НЕДЕТЕРМИНИСТИЧНА .Освен това, функция, която чете данни от нерепликирана схема, е очевидно НЕДЕТЕРМИНИСТИЧНА.*



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да вмъкна специални символи в база данни?

  2. При какви обстоятелства бихте искали Rails да бъде настроен да НЕ се свързва отново с MYSQL

  3. MySQL получава всички засегнати редове за множество изрази в една заявка

  4. Объркано SQL изключение за JDBC

  5. Какви са разликите между обратна отметка и единични кавички? Мога ли да използвам оператор IF в заявка, както е по-горе?