2014-04-12 4 views
1

Я пытаюсь использовать SQLite для запуска тестов интеграции NHibernate. NHibernate's SchemaExport настроит базу данных для меня на основе файлов сопоставления. Это прекрасно работает, за исключением моих триггеров. Вот что такое триггер в .hbm файл выглядит следующим образом:SQLiteException «логическая ошибка рядом с« ON »» при создании триггера

<database-object> 
    <create> 
    CREATE TRIGGER TR_PersonInserted ON Person AFTER INSERT AS 
    BEGIN 
     SET NOCOUNT ON 

     UPDATE Person 
     SET ModifiedDate = GetDate(), CreatedDate = GetDate() 
     FROM inserted 
     WHERE Person.PersonId = inserted.PersonId 

     SET NOCOUNT OFF 
    END 
    </create> 
    <drop> 
    </drop> 
</database-object> 

Это отлично работает в SQL Server 2012.

Без этого триггера SchemaExport также отлично работает при использовании SQLite. С этого триггера, хотя, я получаю исключение при создании схемы:

System.Data.SQLite.SQLiteException: SQL логическая ошибка или отсутствует база данных вблизи «ON»: ошибка синтаксиса

Этот не очень описательна. Я попробовал несколько вещей, чтобы получить немного дальше, в том числе:

  • Удаление содержимого (т.е. все между BEGIN и END)
  • Удаление AS о
  • Удаление ON о
  • Извлечение подчеркивание от имени триггера
  • Добавление ; до выписки

Ничто не помогает.

Что мне не хватает? Каков правильный синтаксис триггера в SQLite?

Я бы предпочел решение, которое также прекрасно работает в SQL-Server-2012, но я не суетился об этом, так как я могу создать другой триггер на диалоговом диалоговом окне базы данных, если это необходимо.

PS. Я использую пакет NuGet для System.Data.SQLite (x86/x64).

ответ

1

В SQLite's CREATE TRIGGER принимает синтаксис в виде

CREATE TRIGGER t AFTER INSERT ON x 
BEGIN {stmts} END 

тогда SQL Server's CREATE TRIGGER и предоставленной схеме, находится в форме

CREATE TRIGGER t ON x AFTER INSERT 
AS {stmts} 

Нормализация две различные формы синтаксиса через различные ядро ​​базы данных не кажутся практичными с непосредственно указанным SQL DDL, особенно учитывая другие отличия, такие как отсутствие SET NOCOUNT в SQLite.

Чтобы поместить это в полный пример, на основе вашего конкретного случая, это сведется к:

CREATE TRIGGER TR_PersonInserted INSERT ON Person 
BEGIN 
    UPDATE Person 
    SET ModifiedDate = DATETIME('NOW'), CreatedDate = DATETIME('NOW') 
    WHERE PersonId = new.PersonId; 
END 
+1

@Jeroen Круто :) На различные проблемы! – user2864740

+1

@Jeroen Спасибо! Я поклонник улучшения ответов. – user2864740

Смежные вопросы