Я работаю с библиотекой 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.