2016-07-14 3 views
1

Я работаю с библиотекой libmysqld c в приложении C++ в окнах, чтобы взаимодействовать со встроенным сервером mysql, то есть сервером mysql, который подключен к сети в течение всего жизненного цикла процесса, который его внедряет. Приложение, создающее базу данных, использует файл .ini для mysql для создания каталога данных относительно каталога приложения, а не в глобальной установочной папке mysql, например.Создание триггеров с использованием встроенного mysql C++

[libmysqld_server] 
basedir=./ 
datadir=./Database 

Я могу запрограммировать создание триггера без проблем, например.

status = mysql_query(mysql, 
     "CREATE TRIGGER del_trigger AFTER DELETE ON table FOR EACH ROW\ 
     INSERT INTO otherTable (col1, col2) VALUES (OLD.col1, OLD.col2)\ 
     "); 

    if (status == 0) { 
     Log(DEBUG, "Initialize(): <%p> Delete Trigger creation passed ...", this); 
    } 
    else { 
     Log(DEBUG, "Initialize(): <%p> Delete Trigger creation failed with error %s...", this, mysql_error(mysql)); 
    } 

Проблема я столкнулся, однако, что, когда триггер вызывается, MySQL будет жаловаться, что таблица mysql.proc не существует, потому что у меня нет базы данных MySQL внутри моего приложения определенного DATADIR. Я попытался скопировать папку MySQL из каталога установки в C: \ Program Files \ MySQL ... но потом я столкнулся с проблемами, где MySQL сообщает

Error:Cannot load from mysql.proc. The table is probably corrupted 

Единственный совет, который я видел, связанные с указанными выше ошибками для запуска команды «mysql_upgrade», которая, похоже, не работает для случая встроенной базы данных, используя собственный datadir. Я нахожусь в точке, где созданы все таблицы, и их соответствующие триггеры настроены, но просто не могут обойти эту ошибку mysql.proc.

UPDATE:

Я также вижу некоторое противоречивое поведение здесь. Моя версия MySQL - «mysql-5.5.16-win32», и она поставляется с двоичным файлом mysql_embedded.exe, который я могу использовать, чтобы открыть консоль и указать файлы базы данных, созданные моим приложением, когда она не запущена. Когда я выполняю операции в mysql_embedded.exe, триггеры работают без проблем (ошибки «mysql.proc, вероятно, повреждены»). Таким образом, похоже, что только libmysqld c api имеет проблемы с системными таблицами mysql.

ответ

0

Решение было таким же простым, как и проверка того, что база данных «mysql» была той же версией, что и версия mysql, встроенная в libmysqld. Я проверил свою версию клиента информацию через следующие:

const char * version = mysql_get_client_info(); 

Возвращаемый «5.1.44» вместо «5.5.16», что я ожидал. Загрузка ZIP-архива mysql для 5.1.44 и использование базы данных mysql в datadir исправили проблему, с которой я столкнулся.