Создание триггеров с использованием встроенного mysql Stack Overflow

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

[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 в каталоге данных конкретного приложения. Я попытался скопировать папку mysql из каталога установки в C: \ Program Files \ MySQL … но затем я столкнулся с проблемами, когда MySQL сообщает

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

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

ОБНОВИТЬ:

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

1

Решение

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

const char * version = mysql_get_client_info();

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]