Триггерная команда SQL Create работает нормально через MySQL Workbench, но ошибки при вызове через Entity Framework - PullRequest
0 голосов
/ 14 июня 2019

У меня есть следующий код для создания SQL, устанавливающего триггер (еще не подготовленный оператор).

commandList.Add($"DROP TRIGGER if exists `{tableName}_after_insert`;");
commandList.Add($"delimiter $$" + Environment.NewLine +
    $"CREATE TRIGGER `{tableName}_after_insert` AFTER INSERT" + Environment.NewLine +
    $"ON `{tableName}`" + Environment.NewLine +
    "FOR EACH ROW BEGIN" + Environment.NewLine +
    "Insert into HashEntry(TableName, TableRowId, TokenValue)" + Environment.NewLine +
    $"select '{tableName}', n.{tableKey}, 'tokenValue' from NEW n;" + Environment.NewLine +
    "END;" + Environment.NewLine +
    "$$" + Environment.NewLine +
    "delimiter ;");

//then some unrelated code until we execute

foreach (var command in commandList)
{
    Database.ExecuteSqlCommand(command);
}

Это создает следующий SQL, который работает в Workbench и Entity Framework.

DROP TRIGGER if exists `MyTable_after_insert`; 

И это, которое работает только в Workbench напрямую.

delimiter $$
CREATE TRIGGER `MyTable_after_insert` AFTER INSERT
ON `MyTable`
FOR EACH ROW BEGIN
Insert into HashEntry(TableName, TableRowId, TokenValue)
select 'MyTable', n.Id, 'tokenValue' from NEW n;
END;
$$
delimiter ;

, которое дает следующую ошибку.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'delimiter $$
CREATE TRIGGER `MyTable_after_insert` AFTER INSERT

Я не уверен, почему это будет работать непосредственно в Workbench, но невызывая ту же команду через EF.

Есть идеи?

1 Ответ

1 голос
/ 16 июня 2019

DELIMITER $$ - это специальный синтаксис, понятный только MySQL Workbench.Нет необходимости при выполнении команд на сервере с использованием MySqlCommand.Просто выполните SQL напрямую:

commandList.Add($@"CREATE TRIGGER `{tableName}_after_insert` AFTER INSERT
    ON `{tableName}`
    FOR EACH ROW BEGIN
    Insert into HashEntry(TableName, TableRowId, TokenValue)
    select '{tableName}', n.{tableKey}, 'tokenValue' from NEW n;
    END;");

(обратите внимание, что я использую дословные строки , чтобы избежать всей конкатенации с Environment.NewLine.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...