gpt4 book ai didi

创建触发器时出现 SQLiteException « "ON"附近的逻辑错误 »

转载 作者:行者123 更新时间:2023-12-02 02:11:36 27 4
gpt4 key购买 nike

我正在尝试使用 SQLite 运行 NHibernate 集成测试。 NHibernate 的 SchemaExport 将根据我的映射文件为我设置数据库。除了我的触发器之外,这工作得很好。 .hbm 文件中的触发器如下所示:

<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 logic error or missing database near "ON": syntax error

这不是很具有描述性。我尝试了一些方法来取得进一步的进展,包括:

  • 删除内容(即 BEGINEND 之间的所有内容)
  • 删除 AS 语句
  • 删除 ON 语句
  • 删除触发器名称中的下划线
  • 在语句前添加 ;

似乎没有什么帮助。

我错过了什么? SQLite 中触发器的正确​​语法是什么?

我更喜欢在 SQL-Server-2012 中也能正常工作的解决方案,但我对此并不大惊小怪,因为如果需要,我可以为每个数据库方言创建不同的触发器。

PS。我正在使用 NuGet 包 System.Data.SQLite (x86/x64) .

最佳答案

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 来规范跨不同数据库引擎的两种不同语法形式似乎并不实际,特别是考虑到其他差异(例如 SQLite 中缺少 SET NOCOUNT)。

要根据您的具体情况将其放入完整的示例中,可以归结为:

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

关于创建触发器时出现 SQLiteException « "ON"附近的逻辑错误 »,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23037157/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com